mysql分表那些事儿
? ? ? ?從前不太喜歡發博客,覺得太繁雜,感覺平時的工作開發就已經夠忙的了,所以很多時候心里想寫,但是行動不允許。最近因為工作也還輕松,因此有時間來整理一下自己之前用到過的和了解的一些東西。今天來說說mysql分表的一些事兒,其實也沒多大事兒,只不過總結一下自己的經驗吧。
? ? ? ?我們知道當mysql表數據相當大的時候我們會選擇分表,或者當我們預期數據表會很大的時候,會想一些辦法來設計表。比如分表,分表包括橫向分表和縱向分表,橫向分表就是講數據表的數據平行切割成兩張表或多張表,那么縱向分表就是將數據表中一些比較大的或者不經常用的一些字段分割出去,比如會員表中的一些字段如個性簽名、愛好這些,我們不經常用這些字段來搜索,那么把他們放在另外一張表中,既可以讓我們的數據表字段變得清晰,又可以在查詢時是查詢速度變快,然后當數據量過大時就該考慮橫向分表了。橫向分表即是將數據分開放到別的表里,而新建的這張表的字段又和剛才那張表一致,大概有這么幾種方法:
? ? ? ?1、id 分割法?,包括兩種分法。第一種是當 id 達到一個數量的時候新建分表然后將新增的數據添加到新增的分表中;第二種方法就是平常很多見的取模分法,建立一個觸發器或函數在添加之前獲取到 主鍵 id ,然后讓 主鍵 對 表數 取余,例如 15 % 10 = 5 那么就將數據放在第 5 張表中。
? ? ? ?2、時間分割法,就是判斷當前時間,按照年、月、日來分,不存在包含當前時間的表名則新建表,將數據添加到新表中。
? ? ? ?我所了解的普通常見的就這么兩種,當然也有根據不同的需求來實現一些奇怪的分表,然而分表容易,這是這么寫一兩個函數去執行就可以,問題的關鍵在于查詢,常見的會員表、訂單表、商品表等都需要分表,分完表之后還需要去查詢,當我們看到 union 這種方法能將所有表連接起來查詢的時候如獲珍寶,但仔細想想卻有點太傻,你要是分兩三張表的話,用這種方法就可以了,但是當我們的分表數量很大的時候怎么辦,難道也去一張張的連起來,分表的意義就沒有了,還不如不分呢,都知道分表之后幾乎不能用索引,如果不分的話或許還可以利用索引來優化一下,但分表之后索引怎么用呢,no way !
? ? ? ?其實 mysql 有一種引擎是專門來解決所有分表問題的 ,那就是 mysql 的 MERGE?引擎 :?MERGE存儲引擎把一組MyISAM數據表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成一個MERGE數據表結構的各成員MyISAM數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。
注意 :
1、分表表結構必須與主表完全一致,包括列名、順序。UNION表必須同屬一個DATABASE。
2、分表類型必須是MyISAM的,總表必須使用 MRG_MYISAM 存儲引擎。
3、可以通過修改.mrg文件來修改主表,每個分表的名字占一行。注意:修改后要通過FLUSH TABLES刷新表緩存。
4、對分表的更改可以直接反映在主表上,但在使用總表時,盡量不要對分表進行改、刪、查等操作。
5、INSERT_METHOD的取值可以是: 0 不允許插入 FIRST 插入到UNION中的第一個表 LAST 插入到UNION中的最后一個表。(4.0之后可用)
6、定義在它上面的約束沒有任何作用,約束是由基本表控制的,例如兩個分表中存在著同樣的一個Key值,那么在MERGE表中會有兩個一樣的Key值。
MERGE分表的優點就是搜索效率快。
? ? ?好了,到這里我們的數據庫分表已經介紹的差不多了,當然對于也可能有我沒有想到的地方,歡迎大家在下方評論留言,我們可以一起討論。
?
總結
以上是生活随笔為你收集整理的mysql分表那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wordpress4.9服务器迁移
- 下一篇: 马斯克锐评人工智能:是人类最大的威胁之一