MySQL使用MRG_MyISAM(MERGE)實(shí)現(xiàn)分表后查詢(xún)的示例
數(shù)據(jù)庫(kù)大數(shù)據(jù)量?jī)?yōu)化是一門(mén)很大的學(xué)問(wèn),也是做為一名開(kāi)發(fā)者需要掌握的專(zhuān)業(yè)技能。
MySQL分表方式分為垂直分表和水平分表,這兩種分表形式都比較簡(jiǎn)單,簡(jiǎn)單理解垂直分表指的是:表的記錄并不多,但是字段卻很長(zhǎng),表占用空間很大,檢索表的時(shí)候需要執(zhí)行大量的IO,嚴(yán)重降低了性能。這時(shí)需要把大的字段拆分到另一個(gè)表,并且該表與原表是一對(duì)一的關(guān)系。而水平分表則是在同一個(gè)數(shù)據(jù)庫(kù)內(nèi),把同一個(gè)表的數(shù)據(jù)按一定規(guī)則拆到多個(gè)表中,目的是優(yōu)化單一表數(shù)據(jù)量過(guò)大而產(chǎn)生的性能問(wèn)題,避免IO爭(zhēng)搶并減少鎖表的幾率。
實(shí)現(xiàn)分表很簡(jiǎn)單,復(fù)雜的是分表之后如何查詢(xún)數(shù)據(jù)?今天的實(shí)現(xiàn)方式是使用Mysql表引擎MRG_MyISAM(MERGE)
MERGE存儲(chǔ)引擎,也被認(rèn)識(shí)為MRG_MyISAM引擎,是一個(gè)相同的可以被當(dāng)作一個(gè)來(lái)用的MyISAM表的集合。“相同”意味著所有表同樣的列和索引信息。你不能合并列被以不同順序列于其中的表,沒(méi)有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來(lái)壓縮。表選項(xiàng)的差異,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
當(dāng)你創(chuàng)建一個(gè)MERGE表之時(shí),MySQL在磁盤(pán)上創(chuàng)建兩個(gè)文件。文件名以表的名字開(kāi)始,并且有一個(gè)擴(kuò)展名來(lái)指明文件類(lèi)型。一個(gè).frm文件存儲(chǔ)表定義,一個(gè).MRG文件包含被當(dāng)作一個(gè)來(lái)用的表的名字。這些表作為MERGE表自身,不必要在同一個(gè)數(shù)據(jù)庫(kù)中。
你可以對(duì)表的集合用SELECT, DELETE, UPDATE和INSERT。你必須對(duì)你映射到一個(gè)MERGE表的這些表有SELECT, UPDATE和DELETE 的權(quán)限。
如果你DROP MERGE表,你僅在移除MERGE規(guī)格。底層表沒(méi)有受影響。
當(dāng)你創(chuàng)建一個(gè)MERGE表之時(shí),你必須指定一個(gè)UNION=(list-of-tables)子句,它說(shuō)明你要把哪些表當(dāng)作一個(gè)來(lái)用。如果你想要對(duì)MERGE表的插入發(fā)生在UNION列表中的第一個(gè)或最后一個(gè)表上,你可以選擇地指定一個(gè)INSERT_METHOD選項(xiàng)。使用FIRST或LAST值使得插入被相應(yīng)地做在第一或最后一個(gè)表上。如果你沒(méi)有指定INSERT_METHOD選項(xiàng),或你用一個(gè)NO值指定該選項(xiàng)。往MERGE表插入記錄的試圖導(dǎo)致錯(cuò)誤。
舉個(gè)例子:
創(chuàng)建兩個(gè)子分表:
CREATE TABLE `yzm_table1` ( `id` int(10) unsigned NOT NULL, `title` varchar(100) NOT NULL DEFAULT '', `content` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `yzm_table2` ( `id` int(10) unsigned NOT NULL, `title` varchar(100) NOT NULL DEFAULT '', `content` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
表創(chuàng)建完畢了,需要注意的是這里的id不能設(shè)為自增,而且所有的表結(jié)構(gòu)必須一致,包括結(jié)構(gòu),類(lèi)型,長(zhǎng)度,字段的順序都必須一致那么對(duì)于這個(gè)id如何取得呢?后面我會(huì)詳細(xì)說(shuō)明。現(xiàn)在,我們需要一個(gè)合并表,用于查詢(xún),創(chuàng)建合并表的代碼如下:
CREATE TABLE `yzm_table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL DEFAULT '', `content` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO INSERT_METHOD=LAST UNION=(`yzm_table1`,`yzm_table2`);
合并表也必須和前面的表有相同的結(jié)構(gòu),類(lèi)型,長(zhǎng)度,包括字段的順序都必須一致這里的 INSERT_METHOD=NO 表示不允許對(duì)本表進(jìn)行insert操作。好了,當(dāng)需要查詢(xún)的時(shí)候,我們可以只對(duì)yzm_table這個(gè)表進(jìn)行操作就可以了,也就是說(shuō)這個(gè)表僅僅只能進(jìn)行select操作。
插入一些數(shù)據(jù)測(cè)試:
INSERT INTO `yzm_table1` VALUES ('1', 'table1-1', 'content1-1'); INSERT INTO `yzm_table1` VALUES ('2', 'table1-2', 'content1-2'); INSERT INTO `yzm_table2` VALUES ('3', 'table2-1', 'content2-1'); INSERT INTO `yzm_table2` VALUES ('4', 'table2-2', 'content2-2'); INSERT INTO `yzm_table2` VALUES ('5', 'table2-3', 'content2-3');
然后查詢(xún)合并表(主表)
SELECT * FROM `yzm_table` LIMIT 10;
果然可以查詢(xún)到所有關(guān)聯(lián)子表的所有數(shù)據(jù),這樣就可以對(duì)所有的數(shù)據(jù)進(jìn)行分頁(yè)、統(tǒng)計(jì)等查詢(xún)了。
以上就是MySQL使用MRG_MyISAM(MERGE)實(shí)現(xiàn)分表后查詢(xún)的示例的詳細(xì)內(nèi)容,更多關(guān)于MySQL 分表后查詢(xún)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單了解操作mysql數(shù)據(jù)庫(kù)的命令行神器mycli
這篇文章主要介紹了簡(jiǎn)單了解操作mysql數(shù)據(jù)庫(kù)的命令行神器mycli,今天發(fā)現(xiàn)一個(gè)操作數(shù)據(jù)庫(kù)的命令行工具,可以自動(dòng)補(bǔ)全和語(yǔ)法高亮,,需要的朋友可以參考下2019-06-06Myeclipse 自動(dòng)生成可持久化類(lèi)的映射文件的方法
這篇文章主要介紹了Myeclipse 自動(dòng)生成可持久化類(lèi)的映射文件的方法的相關(guān)資料,這里提供了詳細(xì)的實(shí)現(xiàn)步驟,需要的朋友可以參考下2016-11-11Eclipse與MySQL數(shù)據(jù)庫(kù)的連接教程(已實(shí)操)
用eclipse編寫(xiě)的好的代碼,我們?cè)趺床拍苓B接到數(shù)據(jù)庫(kù)呢?下面這篇文章主要給大家介紹了關(guān)于Eclipse與MySQL數(shù)據(jù)庫(kù)連接的相關(guān)資料,下面的操作是經(jīng)本人驗(yàn)證,確實(shí)可行,需要的朋友可以參考下2023-05-05使用mysqldump導(dǎo)入數(shù)據(jù)和mysqldump增量備份(mysqldump使用方法)
mysqldump常用于MySQL數(shù)據(jù)庫(kù)邏輯備份,下面看實(shí)例吧2013-12-12Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫(kù)教程
大家好,本篇文章主要講的是Linux環(huán)境下安裝mysql5.7.36數(shù)據(jù)庫(kù)教程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能
這篇文章主要介紹了MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10MYSQL8 通過(guò)ibd文件恢復(fù)表數(shù)據(jù)的方法
這篇文章主要介紹了MYSQL8 通過(guò)ibd文件恢復(fù)表數(shù)據(jù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01