mysql 查看所有引擎 如何將MySQL中的引擎改為innodb?
如何將MySQL中的引擎改為innodb?從MySQL 5.7開(kāi)始,開(kāi)發(fā)者改變了InnoDB構(gòu)建二級(jí)索引的,采用了自底向上的方法,而不是早期版本中自頂向下的方法。在本文中,我們將通過(guò)一個(gè)例子來(lái)說(shuō)明如何
如何將MySQL中的引擎改為innodb?
從MySQL 5.7開(kāi)始,開(kāi)發(fā)者改變了InnoDB構(gòu)建二級(jí)索引的,采用了自底向上的方法,而不是早期版本中自頂向下的方法。在本文中,我們將通過(guò)一個(gè)例子來(lái)說(shuō)明如何構(gòu)建InnoDB索引。最后,我將解釋如何為innodb_fill_factor設(shè)置一個(gè)更合適的值。
索引構(gòu)建過(guò)程
要在包含數(shù)據(jù)的表上構(gòu)建索引,InnoDB有以下幾個(gè)階段:讀取階段(從聚集索引中讀取并構(gòu)建二級(jí)索引條目)2。合并和排序階段3。插入階段(將排序后的記錄插入到二級(jí)索引中)在5.6版本之前,MySQL通過(guò)一次插入一條記錄的構(gòu)建二級(jí)索引。這是一個(gè) "自上而下和接近。搜索插入位置從樹(shù)根(頂部)開(kāi)始,到達(dá)樹(shù)葉(底部)。記錄入到光標(biāo)所指的葉頁(yè)面上。尋找插入位置并分割和合并面是非常昂貴的。從MySQL 5.7開(kāi)始,添加索引時(shí)的插入階段使用 "分類(lèi)索引構(gòu)建與應(yīng)用,也被稱(chēng)為 "批量索引加載和。在這種方法中,建立了索引 "自下而上 "。即先構(gòu)建葉級(jí)頁(yè)面(下),然后非葉級(jí)到達(dá)根級(jí)頁(yè)面(上)。
例子
在以下情況下使用有序索引結(jié)構(gòu):
ALTER TABLE t1添加索引(或創(chuàng)建索引)
ALTER TABLE t1添加全文索引
更改表t1添加列,算法就位
優(yōu)化t1
對(duì)于最后兩個(gè)用例,ALTER創(chuàng)建一個(gè)中間表。中間表索引(主索引和次索引)是使用 "有序索引構(gòu)建與應(yīng)用。
算法
在級(jí)別0創(chuàng)建一個(gè)頁(yè)面,并為此頁(yè)面創(chuàng)建一個(gè)光標(biāo)。
將光標(biāo)放在0層插入頁(yè)面,直到頁(yè)面填滿(mǎn)。
當(dāng)頁(yè)面已滿(mǎn)時(shí),創(chuàng)建一個(gè)兄弟頁(yè)面(don 不要將其插入到兄弟頁(yè)面中)。
為當(dāng)前整頁(yè)創(chuàng)建一個(gè)節(jié)點(diǎn)指針(一個(gè)子頁(yè)中最小的鍵,子頁(yè)號(hào)),將節(jié)點(diǎn)指針插入上一級(jí)(父頁(yè))。
在更高的級(jí)別,檢查光標(biāo)的位置。如果沒(méi)有,請(qǐng)為此級(jí)別創(chuàng)建一個(gè)父頁(yè)面和光標(biāo)。
將節(jié)點(diǎn)指針插入父頁(yè)面。
如果父頁(yè)面已滿(mǎn),請(qǐng)重復(fù)步驟3、4、5和6。
現(xiàn)在插入同級(jí)頁(yè)面,并將光標(biāo)指向同級(jí)頁(yè)面。
在所有插入的結(jié)尾,每個(gè)級(jí)別的光標(biāo)都指向最右邊的頁(yè)面。提交所有游標(biāo)(意味著提交修改頁(yè)面的微型事務(wù)并釋放所有閂鎖)
為了簡(jiǎn)單起見(jiàn),上面的算法跳過(guò)了關(guān)于壓縮頁(yè)面和BLOB(外部存儲(chǔ)的BLOB)處理的細(xì)節(jié)。
為簡(jiǎn)單起見(jiàn),假設(shè)子頁(yè)和非子頁(yè)中允許的最大記錄數(shù)是3。
創(chuàng)建表格E t1 (a INT主鍵,b INT,c BLOB);
插入t1值(1,11,hello 111);
插入t1值(2,22,hello 222);
插入t1值(3,33,hello 333);
插入t1值(4,44,hello 444);
插入t1值(5,55,hello 555);
插入t1值(6,66,hello 666);
插入t1值(7,77,hello 777);
插入t1值(8,88,hello 888);
插入t1值(9,99,hello 999);
插入t1值(10,1010,hello 101010);
更改表t1添加索引k1(b);
InnoDB將主鍵字段附加到二級(jí)索引。次級(jí)索引k1的記錄格式是(b,a)。排序階段完成后,它被記錄為:
(11,1), (22,2), (33,3), (44,4), (55,5), (66,6), (77,7), (88,8), (99,9), (1010, 10)
初始插入階段
讓 讓我們從record (11,1)開(kāi)始。
在0級(jí)(葉級(jí))創(chuàng)建頁(yè)面
創(chuàng)建指向頁(yè)面的光標(biāo)。
所有插入都將轉(zhuǎn)到該頁(yè),直到該頁(yè)填滿(mǎn)。
箭頭顯示光標(biāo)當(dāng)前指向的位置。它當(dāng)前在第5頁(yè),下一次插入將轉(zhuǎn)到這一頁(yè)。
還有兩個(gè)空閑槽,所以插入記錄(22,2)和(33,3)非常簡(jiǎn)單。對(duì)于下一個(gè)記錄(44,4),第5頁(yè)已滿(mǎn)(前面提到的假設(shè)是最大記錄數(shù)為3)。這是步驟。頁(yè)面填充中的索引構(gòu)造
創(chuàng)建一個(gè)頁(yè)碼為6的兄弟頁(yè)面。
唐 不要插入兄弟頁(yè)面
在光標(biāo)處提交頁(yè)面,即微型事務(wù)提交、釋放閂鎖等。
作為提交的一部分,創(chuàng)建一個(gè)節(jié)點(diǎn)指針,并將其插入到[當(dāng)前級(jí)別1](即在級(jí)別1)的父頁(yè)面中。
節(jié)點(diǎn)指針的格式(子頁(yè)面中的最小鍵,子頁(yè)面編號(hào))。第5頁(yè)上最小的鍵是(11,1)。在父級(jí)插入記錄((11,1),5)。
1級(jí)的父頁(yè)面還不存在,MySQL創(chuàng)建的。創(chuàng)建第7頁(yè),光標(biāo)指向第7頁(yè)。
在第7頁(yè)插入((11,1),5)。
現(xiàn)在,回到第0層,創(chuàng)建一個(gè)從第5頁(yè)到第6頁(yè)的鏈接,反之亦然。
級(jí)別0的光標(biāo)現(xiàn)在指向頁(yè)碼為6的同級(jí)頁(yè)面。
在第6頁(yè)插入(44,4)。
接下來(lái)的插入——(55,5)和(66,6)——很簡(jiǎn)單。他們翻到第6頁(yè)。
Inserting records (77,7)與(44,4)類(lèi)似,只是父頁(yè)面(頁(yè)碼7)已經(jīng)存在,并且有空間容納兩條以上的記錄。首先將節(jié)點(diǎn)指針((44,4),8)插入到第7頁(yè),然后將(77,7)記錄到第8頁(yè)的同一層。
插入記錄(88,8)和(99,9)很簡(jiǎn)單,因?yàn)樵诘?頁(yè)上有兩個(gè)空閑的位置。
下一次插入(1010,10)。將節(jié)點(diǎn)指針((77,7),8)插入級(jí)別1的父頁(yè)面(頁(yè)碼7)。MySQL在0級(jí)創(chuàng)建了相同的頁(yè)碼9。將記錄(1010,10)插入第9頁(yè),并將光標(biāo)移至該頁(yè)。諸如此類(lèi)。在上面的示例中,數(shù)據(jù)庫(kù)被提交到級(jí)別0的第9頁(yè)和級(jí)別1的第7頁(yè)。
我們現(xiàn)在有了一個(gè)完整的B樹(shù)索引,它是自底向上構(gòu)建的!
索引填充因子全局變量innodb_fill_factor用于設(shè)置插入到B樹(shù)頁(yè)面中的空間量。默認(rèn)值為100,表示使用整個(gè)區(qū)域(不包括頁(yè)眉)。聚集索引具有innodb_fill_factor100的豁免。在這種情況下,聚集索引也有1/16的空間處于空閑狀態(tài)。也就是說(shuō),6.25%的空間用于未來(lái)的DML。
值為80意味著MySQL使用80%的頁(yè)面空間來(lái)填充,20%的空間留作將來(lái)更新之用。如果innodb_fill_factor100,則沒(méi)有空間留給將來(lái)插入二級(jí)索引。如果在加入指數(shù)后,你期望更多的DML出現(xiàn)在桌面上,可能會(huì)導(dǎo)致行業(yè)的和合并。在這種情況下,建議使用80到90之間的值。此變量還會(huì)影響使用OPTIMIZE TABLE和Alter Table Drop Column,Algorithminplac
mysql怎么啟用innodb數(shù)據(jù)庫(kù)引擎?
1.停止mysql服務(wù)。2.編輯文件,注釋skip-innodb。3.從目錄中刪除三個(gè)文件:ibdata1、ib_logfile0和ib_logfile1。4.啟動(dòng)mysql服務(wù)。