對於資料量很大的一張表,i/o效率底下,分表勢在必行!
使用程式分,對不同的查詢,分配到不同的子表中,是個解決方案,但要改程式碼,對查詢不透明。
好在mysql 有兩個解決方案:
Partition(分割槽,在MySQL 5.1.中實現) 和 Mysql Merge儲存引擎。
CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
對應定期分表的情況下,只要定期相應的增加一個基礎表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name UNION=(...))。
如在增加一個表(需和其他基礎表一樣的結構):
CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
ALTER TABLE total UNION=(t1,t2,t3)
INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一個表),LAST(最後一個表),NO(不能插入)
查詢的時候,和平常一樣
select * from total where ....
merge表會自動找到相應的基礎表進行查詢。
需要注意的是 merge表並不維護 “唯一性”檢查,唯一性有各基礎表完成。所以插入新的記錄時候可能和其他基礎表的內容重複。所以再插入去需要用程式碼進行唯一性檢查。
對於資料量很大的一張表,i/o效率底下,分表勢在必行!
使用程式分,對不同的查詢,分配到不同的子表中,是個解決方案,但要改程式碼,對查詢不透明。
好在mysql 有兩個解決方案:
Partition(分割槽,在MySQL 5.1.中實現) 和 Mysql Merge儲存引擎。
CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
對應定期分表的情況下,只要定期相應的增加一個基礎表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name UNION=(...))。
如在增加一個表(需和其他基礎表一樣的結構):
CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
ALTER TABLE total UNION=(t1,t2,t3)
INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一個表),LAST(最後一個表),NO(不能插入)
查詢的時候,和平常一樣
select * from total where ....
merge表會自動找到相應的基礎表進行查詢。
需要注意的是 merge表並不維護 “唯一性”檢查,唯一性有各基礎表完成。所以插入新的記錄時候可能和其他基礎表的內容重複。所以再插入去需要用程式碼進行唯一性檢查。