萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL 分表存儲的使用示例

MySQL 分表存儲的使用示例

分表存儲是把記錄保存在不同的表表會一個關聯了在這裡我們來看一篇關於MySQL 分表存儲的使用示例,具體的例子如下文介紹。


一般我們項目中如果數據量特別大的話通常會考慮將某一表數據進行分表處理,例如:我們的用戶訪問日志。如果將該數據始終保存在一張表的話那麼久而久之這張表的數據量會特別大,導致查詢效率降低。這個時候就需要考慮將該數據分別存儲到多張表中。
而日志數據具有典型的如下特點:

1. 數據量大。
2. 每天每月都穩定輸出。
3. 對數據的操作在插入之後大部分只有查詢,很少有編輯或者刪除操作。

MySQL數據庫提供了數據分表的方式。

MERGE存儲引擎
我們在使用SQL語句Create table創建表時可以指定數據表的存儲引擎。當我們使用語句ENGINE=MEGRE或者ENGINE=MRG_MyISAM申明存儲引擎時,即代表該數據表使用MERGE存儲引擎存儲數據。該數據表可以是其他特定ENGINE=MEGRE類型數據表的集合。不過這些所謂特定的數據表的表結構和索引必須完全一致(不過定義的順序可以不同)。特別的表的AVG_ROW_LENGTH, MAX_ROWS,PACK_KEYS屬性可以不同。


mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
    ->    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->    message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
mysql> CREATE TABLE total (
    ->    a INT NOT NULL AUTO_INCREMENT,
    ->    message CHAR(20), INDEX(a))
    ->    ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
 
上述代碼是官方文檔中給出的示例代碼。其創建了兩個分表:t1和t2,一個總表total。分別給t1和t2中插入數據,然後在total表中查詢,可以發現在total表中可以查詢到分別插入t1和t2的數據。

我們可以在total表中使用哦SELECT,DELETE,UPDATE和INSERT操作,不過必須要擁有各分表的SELECT,DELETE 和UPDATE權限。

在創建MERGE表時,使用參數UNION對表進行整合,例如上面代碼的UNION=(t1, t2)。也可以使用INSERT_METHOD參數來申明如果在MERGE表中插入數據,是將數據插入到第一張表還是最後一張表中,如果INSERT_METHOD=NO,那麼MEGRE表中將不允許插入數據,只允許插入在各分表當中。

不過另外一個值得注意的地方是上述代碼中我們在分區表中並沒有定義索引,但是在total表中我們定義了INDEX(a)並且沒有定義PRIMARY KEY。這是因為在總表中的數據並不能保證也不檢查數據的唯一性,也就是在各分表中是允許存在完全相同的數據的。

編輯映射
如果我們在使用過程中新建了需要加入總表的分表,這時候通常有兩種方式:

刪掉總表重新創建

使用ALTER TABLE tbl_name UNION=(……)來重新標記需要映射的分表。
如果我們不小心寫成UNION=()(括號中為空),會發現這張表將為空,並且插入不進去數據,因為實際上本身總表不存儲數據,這樣插入數據時MYSQL也就不知道講數據插入到哪了。
一些規則
總表和分表的定義以及索引需要保證大部分的一致。MySQL不會在創建總表的時候去檢查分表的設置有沒有錯誤,只有在打開查詢的時候才會進行判斷有沒有存在錯誤。這也導致我們有可能在創建分表的時候不存在錯誤,然後某天編輯了分表,從而導致主表無法使用的情況。所以我們的總表和分表必須滿足下列規則

總表和分表的列數必須相同。

總表和分表的列順序需要一致。
另外,總表和分表的列規則必須滿足以下規則
列類型必須相同
列的長度必須相同
列的內容可以為NULL
分表的索引數量必須大於等於總表的索引數量。分表的索引數量可以大於總表,但不可以少於總表。
表索引的相關規則:

總表和分表的索引類型必須一致
總表和分表的符合索引部分必須一致
針對索引部分(index part)的額外檢查
索引部分長度必須一致
索引部分類型必須一致
索引部分的語言設置必須一致
可以為空

如果我們的總表在使用過程中無法打開了或者無法使用,我們亦可以使用命令:CHECK TABLE來顯示到底是哪一個分表出現了問題。

copyright © 萬盛學電腦網 all rights reserved