MySQL使用MRG_MyISAM(MERGE)實現(xiàn)分表后查詢的示例
數(shù)據庫大數(shù)據量優(yōu)化是一門很大的學問,也是做為一名開發(fā)者需要掌握的專業(yè)技能。
MySQL分表方式分為垂直分表和水平分表,這兩種分表形式都比較簡單,簡單理解垂直分表指的是:表的記錄并不多,但是字段卻很長,表占用空間很大,檢索表的時候需要執(zhí)行大量的IO,嚴重降低了性能。這時需要把大的字段拆分到另一個表,并且該表與原表是一對一的關系。而水平分表則是在同一個數(shù)據庫內,把同一個表的數(shù)據按一定規(guī)則拆到多個表中,目的是優(yōu)化單一表數(shù)據量過大而產生的性能問題,避免IO爭搶并減少鎖表的幾率。
實現(xiàn)分表很簡單,復雜的是分表之后如何查詢數(shù)據?今天的實現(xiàn)方式是使用Mysql表引擎MRG_MyISAM(MERGE)
MERGE存儲引擎,也被認識為MRG_MyISAM引擎,是一個相同的可以被當作一個來用的MyISAM表的集合?!跋嗤币馕吨斜硗瑯拥牧泻退饕畔ⅰD悴荒芎喜⒘斜灰圆煌樞蛄杏谄渲械谋?,沒有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來壓縮。表選項的差異,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
當你創(chuàng)建一個MERGE表之時,MySQL在磁盤上創(chuàng)建兩個文件。文件名以表的名字開始,并且有一個擴展名來指明文件類型。一個.frm文件存儲表定義,一個.MRG文件包含被當作一個來用的表的名字。這些表作為MERGE表自身,不必要在同一個數(shù)據庫中。
你可以對表的集合用SELECT, DELETE, UPDATE和INSERT。你必須對你映射到一個MERGE表的這些表有SELECT, UPDATE和DELETE 的權限。
如果你DROP MERGE表,你僅在移除MERGE規(guī)格。底層表沒有受影響。
當你創(chuàng)建一個MERGE表之時,你必須指定一個UNION=(list-of-tables)子句,它說明你要把哪些表當作一個來用。如果你想要對MERGE表的插入發(fā)生在UNION列表中的第一個或最后一個表上,你可以選擇地指定一個INSERT_METHOD選項。使用FIRST或LAST值使得插入被相應地做在第一或最后一個表上。如果你沒有指定INSERT_METHOD選項,或你用一個NO值指定該選項。往MERGE表插入記錄的試圖導致錯誤。
舉個例子:
創(chuàng)建兩個子分表:
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, `title`varchar(100)NOTNULLDEFAULT'', `content`varchar(255)NOTNULLDEFAULT'', PRIMARYKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8;
表創(chuàng)建完畢了,需要注意的是這里的id不能設為自增,而且所有的表結構必須一致,包括結構,類型,長度,字段的順序都必須一致那么對于這個id如何取得呢?后面我會詳細說明?,F(xiàn)在,我們需要一個合并表,用于查詢,創(chuàng)建合并表的代碼如下:
CREATETABLE`yzm_table`( `id`int(10)unsignedNOTNULLAUTO_INCREMENT, `title`varchar(100)NOTNULLDEFAULT'', `content`varchar(255)NOTNULLDEFAULT'', PRIMARYKEY(`id`) )ENGINE=MRG_MyISAMDEFAULTCHARSET=utf8INSERT_METHOD=NOINSERT_METHOD=LASTUNION=(`yzm_table1`,`yzm_table2`);
合并表也必須和前面的表有相同的結構,類型,長度,包括字段的順序都必須一致這里的 INSERT_METHOD=NO 表示不允許對本表進行insert操作。好了,當需要查詢的時候,我們可以只對yzm_table這個表進行操作就可以了,也就是說這個表僅僅只能進行select操作。
插入一些數(shù)據測試:
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;
果然可以查詢到所有關聯(lián)子表的所有數(shù)據,這樣就可以對所有的數(shù)據進行分頁、統(tǒng)計等查詢了。
以上就是MySQL使用MRG_MyISAM(MERGE)實現(xiàn)分表后查詢的示例的詳細內容,更多關于MySQL 分表后查詢的資料請關注本站其它相關文章!
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。