mysql連接錯(cuò)誤111怎么解決 MySQL 5.5的InnoDB到底有何問題?
MySQL 5.5的InnoDB到底有何問題?從MySQL5.7就開始,開發(fā)人員決定了InnoDB統(tǒng)合二級索引的,常規(guī)自下而上的方法,而不是早中期版本中自上而下的方法了。在這篇文章中,我們將一個(gè)示例來
MySQL 5.5的InnoDB到底有何問題?
從MySQL5.7就開始,開發(fā)人員決定了InnoDB統(tǒng)合二級索引的,常規(guī)自下而上的方法,而不是早中期版本中自上而下的方法了。在這篇文章中,我們將一個(gè)示例來那說明該如何最終形成InnoDB索引。到最后,我將請解釋怎么為innodb_fill_factor設(shè)置更比較合適的值。
索引構(gòu)建體系過程
在有數(shù)據(jù)的表上構(gòu)建體系索引,InnoDB中有以下幾個(gè)階段:1.加載階段(從聚簇索引讀取數(shù)據(jù)并構(gòu)建體系二級索引條目)2.合并排序階段3.插入到階段(將排序記錄插到二級索引)在5.6版本之前,MySQL通過四次直接插入一條記錄來構(gòu)建二級索引。這是一種“從上而下”的方法。搜索插到位置從樹的根部(頂部)就開始并達(dá)到葉頁(底部)。該記錄直接插入光標(biāo)打向的葉頁上。在查找直接插入位置和進(jìn)行業(yè)面word文檔合并和合并方面開銷不大。從MySQL5.7結(jié)束,添加索引期間的插到階段不使用“排序索引形成完整”,也一般稱“批量索引讀取”。在這種方法中,索引是“由外及里”最終形成的。即葉頁(底部)簡單的方法構(gòu)建,后再非葉級別待到根(頂部)。
示例
在這些情況下不使用排序的索引統(tǒng)合:
ALTERTABLEt1ADDINDEX(求求求CREATEINDEX)
ALTER TABLE t1 ADD FULLTEXT INDEXALTER TABLE t1 ADD COLUMN,ALGORITHM INPLACE
OPIMIZEt1
對于到最后兩個(gè)業(yè)務(wù)應(yīng)用程序,ALTER會創(chuàng)建角色一個(gè)中間表。中間表索引(主要和都無所謂)在用“排序索引統(tǒng)合”統(tǒng)合。
算法
在0級別創(chuàng)建頁,還要甚至于頁創(chuàng)建戰(zhàn)隊(duì)一個(gè)游標(biāo)
使用0級別處的游標(biāo)插入到頁面,等到填進(jìn)
頁面被填滿后,修改一個(gè)兄弟頁(千萬不能插到到兄弟頁)
為當(dāng)前的整頁創(chuàng)建戰(zhàn)隊(duì)節(jié)點(diǎn)指針(子頁中的大于鍵,子頁碼),并將節(jié)點(diǎn)指針再插入上一級(父頁)
在較高級別,檢查游標(biāo)有無已gprs定位。假如沒有,請為該級別創(chuàng)建戰(zhàn)隊(duì)父頁和游標(biāo)
在父頁插到節(jié)點(diǎn)指針
假如父頁已塞滿,請重復(fù)一遍步驟3,4,5,6
現(xiàn)在再插入兄弟頁并使游標(biāo)指向兄弟頁
在所有再插入的末尾,每個(gè)級別的游標(biāo)朝最右邊的頁。再提交所有游標(biāo)(意味著什么再提交可以修改頁面的迷你型事務(wù),能量所有鎖存器)
為簡單起見,上列算法跳過了或是壓解頁和BLOB(外部存儲的BLOB)如何處理的細(xì)節(jié)。
通過由下的最終形成索引為簡單點(diǎn)起見,假設(shè)不成立子頁和非子頁中容許的最大記錄數(shù)為3
CREATETABLEt1(aINT PRIMARY KEY,b INT,c BLOB);
INSERTINTOt1VALUES(1,11,嗨小伙伴們111);
INSERTINTOt1VALUES(2,22,hello!222);
INSERTINTOt1VALUES(3,33,hello,hello333);
INSERTINTOt1VALUES(4,44,hello!444);
INSERTINTOt1VALUES(5,55,嗨小伙伴們555);
INSERTINTOt1VALUES(6,66,hi~666);
INSERTINTOt1VALUES(7,77,hello!777);
INSERT INTO t1 VALUES(8,82,hello!888);
INSERTINTOt1VALUES(9,99,嗨小伙伴們999);
INSERTINTOt1VALUES(10,1010,hi~101010);
ALTERTABLEt1ADDINDEXk1(b);
InnoDB將主鍵字段賞分到二級索引。二級索引k1的記錄格式為(b,a)。在排序階段成功后,記錄為:
(11,1),(22,2),(33,3),(44,4),(55,5),(66,6),(77,7),(78,8),(99,9),(1010,10)
初始再插入階段
讓我們從有記錄(11,1)正在。
在0級別(葉級別)創(chuàng)建家族頁
修改一個(gè)到頁的游標(biāo)
所有插到都將轉(zhuǎn)到此頁面,待到它填滿了
箭頭不顯示游標(biāo)當(dāng)前朝的位置。它目前位處第5頁,下一個(gè)插入到將投到此頁面。
還有兩個(gè)閑時(shí)插槽,所以再插入記錄(22,2)和(33,3)的很簡單點(diǎn)是對下一條記錄(44,4),頁碼5已滿(前面提到的假設(shè)大的記錄數(shù)為3)。這那是步驟。頁填充時(shí)的索引統(tǒng)合
創(chuàng)建家族一個(gè)兄弟頁,頁碼6
別直接插入兄弟頁
在游標(biāo)處遞交頁面,即小巧事務(wù)提交,釋放出鎖存器等
才是再提交的一部分,創(chuàng)建角色節(jié)點(diǎn)指針并將其插到到【當(dāng)前級別1】的父頁面中(即在1級別)
節(jié)點(diǎn)指針的格式(子頁面中的最大值鍵,子頁碼)。第5頁的小于鍵是(11,1)。在父級別再插入記錄((11,1),5)。
1級別的父頁尚不存在,MySQL創(chuàng)建家族頁碼7和打向頁碼7的游標(biāo)。
將((11,1),5)直接插入第7頁
現(xiàn)在,返回到0級并修改從第5頁到第6頁的鏈接,道理一樣
0級別的游標(biāo)現(xiàn)在打向兄弟頁,頁碼為6
將(44,4)插入到第6頁
下另一個(gè)直接插入-(55,5)和(66,6)-很簡單,它們回到第6頁。
插入記錄(77,7)類似(44,4),之外父頁面(頁面編號7)巳經(jīng)修真者的存在因此它有兩個(gè)以上記錄的空間。首先將節(jié)點(diǎn)指針((44,4),8)插到第7頁,后再將(77,7)有記錄到同級8頁中。
插到記錄(89,8)和(99,9)很簡單點(diǎn),因?yàn)榈?頁有兩個(gè)多余的時(shí)間插槽。
下另一個(gè)直接插入(1010,10)。將節(jié)點(diǎn)指針((77,7),8)插入1級別的父頁(頁碼7)。MySQL在0級創(chuàng)建戰(zhàn)隊(duì)同級頁碼9。將記錄(1010,10)插到第9頁并將光標(biāo)可以修改這一點(diǎn)頁面。以此類推。在上面的示例中,數(shù)據(jù)庫在0級別重新提交到第9頁,在1級別并提交到第7頁。
我們現(xiàn)在有了三個(gè)求下載的B-tree索引,它是自下誠信立院統(tǒng)合的!
索引再填充因子全局變量innodb_fill_factor應(yīng)用于設(shè)置里插入到B-tree頁中的空間量。默認(rèn)值為100,它表示在用整個(gè)業(yè)面(不和頁眉)。聚簇索引更具innodb_fill_factor100的無需承擔(dān)項(xiàng)。在這種下,聚簇索引也空間的1/16盡量空閑。即6.25%的空間用于未來的DML。
值80意味著MySQL建議使用了80%的頁空間填充,確認(rèn)好20%于未來的更新。如果不是innodb_fill_factor100則沒有余下空間供未來插入二級索引。如果不是在再添加索引后,希望表上有更多的DML,則可能導(dǎo)致業(yè)面全部拆分并再一次單獨(dú)設(shè)置。在情況下,我建議你建議使用80-90之間的值。此變量還會影響不大在用OPTIMIZETABLE和ALTER TABLE DROP COLUMN,ALGOITHMINPLACE重新創(chuàng)建戰(zhàn)隊(duì)的索引。也不可能可以設(shè)置太低的值,比如少于50。是因?yàn)樗饕龝加觅Y源實(shí)在是浪費(fèi)更多的磁盤空間,值較低時(shí),索引中的頁數(shù)較多,索引統(tǒng)計(jì)信息的采樣肯定又不是最佳的。優(yōu)化器可以你選更具次優(yōu)統(tǒng)計(jì)信息的錯(cuò)誤查詢計(jì)劃。
排序索引構(gòu)建的優(yōu)點(diǎn)
沒有頁面表格合并(不包括壓解表)和合并
沒有反復(fù)重復(fù)搜索插入位置
插到絕對不會被系統(tǒng)重裝記錄(頁分配.),而重裝日志子系統(tǒng)的壓力較小
缺點(diǎn)
ALTER正在進(jìn)行時(shí),插入到性能降底Bug#82940,但在后續(xù)版本中計(jì)劃修復(fù)。
sock 文件如何生成?
3種比較普遍的情況
鏈接信息的參數(shù)有不對的,比如,密碼錯(cuò)了等。解決方案,這個(gè)帳號用mysqlclient工具測試連接上幫一下忙。
sock文件在mysql中配置(象在文件中配置)的與MySQLdb默認(rèn)去連的并非上網(wǎng)通路徑。解決方案,(userroot,dbmysql,passwd111,hostlocalhost,unix_socket{path_did_sock})
服務(wù)什么也沒開起來。