MySQL使用MRG_MyISAM(MERGE)實現分表後查詢的示例
資料庫大資料量優化是一門很大的學問,也是做為一名開發者需要掌握的專業技能。
MySQL分表方式分為垂直分表和水平分表,這兩種分表形式都比較簡單,簡單理解垂直分表指的是:表的記錄並不多,但是欄位卻很長,表佔用空間很大,檢索表的時候需要執行大量的IO,嚴重降低了效能。這時需要把大的欄位拆分到另一個表,並且該表與原表是一對一的關係。而水平分表則是在同一個資料庫內,把同一個表的資料按一定規則拆到多個表中,目的是優化單一表資料量過大而產生的效能問題,避免IO爭搶並減少鎖表的機率。
實現分表很簡單,複雜的是分表之後如何查詢資料?今天的實現方式是使用Mysql表引擎MRG_MyISAM(MERGE)
MERGE儲存引擎,也被認識為MRG_MyISAM引擎,是一個相同的可以被當作一個來用的MyISAM表的集合。“相同”意味著所有表同樣的列和索引資訊。你不能合併列被以不同順序列於其中的表,沒有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來壓縮。表選項的差異,比如AVG_ROW_LENGTH,MAX_ROWS或PACK_KEYS都不重要。
當你建立一個MERGE表之時,MySQL在磁碟上建立兩個檔案。檔名以表的名字開始,並且有一個副檔名來指明檔案型別。一個.frm檔案儲存表定義,一個.MRG檔案包含被當作一個來用的表的名字。這些表作為MERGE表自身,不必要在同一個資料庫中。
你可以對錶的集合用SELECT,DELETE,UPDATE和INSERT。你必須對你對映到一個MERGE表的這些表有SELECT,UPDATE和DELETE 的許可權。
如果你DROP MERGE表,你僅在移除MERGE規格。底層表沒有受影響。
當你建立一個MERGE表之時,你必須指定一個UNION=(list-of-tables)子句,它說明你要把哪些表當作一個來用。如果你想要對MERGE表的插入發生在UNION列表中的第一個或最後一個表上,你可以選擇地指定一個INSERT_METHOD選項。使用FIRST或LAST值使得插入被相應地做在第一或最後一個表上。如果你沒有指定INSERT_METHOD選項,或你用一個NO值指定該選項。往MERGE表插入記錄的試圖導致錯誤。
舉個例子:
建立兩個子分表:
CREATETABLE`yzm_table1`( `id`int(10)unsignedNOTNULL,`title`varchar(100)NOTNULLDEFAULT'',`content`varchar(255)NOTNULLDEFAULT'',PRIMARYKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8; CREATETABLE`yzm_table2`( `id`int(10)unsignedNOTNULL,PRIMARYKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8;
表建立完畢了,需要注意的是這裡的id不能設為自增,而且所有的表結構必須一致,包括結構,型別,長度,欄位的順序都必須一致那麼對於這個id如何取得呢?後面我會詳細說明。現在,我們需要一個合併表,用於查詢,建立合併表的程式碼如下:
CREATETABLE`yzm_table`( `id`int(10)unsignedNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`) )ENGINE=MRG_MyISAMDEFAULTCHARSET=utf8INSERT_METHOD=NOINSERT_METHOD=LASTUNION=(`yzm_table1`,`yzm_table2`);
合併表也必須和前面的表有相同的結構,型別,長度,包括欄位的順序都必須一致這裡的 INSERT_METHOD=NO 表示不允許對本表進行insert操作。好了,當需要查詢的時候,我們可以只對yzm_table這個表進行操作就可以了,也就是說這個表僅僅只能進行select操作。
插入一些資料測試:
INSERTINTO`yzm_table1`VALUES('1','table1-1','content1-1'); INSERTINTO`yzm_table1`VALUES('2','table1-2','content1-2'); INSERTINTO`yzm_table2`VALUES('3','table2-1','content2-1'); INSERTINTO`yzm_table2`VALUES('4','table2-2','content2-2'); INSERTINTO`yzm_table2`VALUES('5','table2-3','content2-3');
然後查詢合併表(主表)
SELECT*FROM`yzm_table`LIMIT10;
果然可以查詢到所有關聯子表的所有資料,這樣就可以對所有的資料進行分頁、統計等查詢了。
以上就是MySQL使用MRG_MyISAM(MERGE)實現分表後查詢的示例的詳細內容,更多關於MySQL 分表後查詢的資料請關注我們其它相關文章!