表t的結(jié)構(gòu)見(jiàn)MySQL索引選擇規(guī)劃。
創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元合陽(yáng)做網(wǎng)站,已為上家服務(wù),為合陽(yáng)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
Extra中包含Using filesort表示需要排序,在排序時(shí), MySQL會(huì)為每個(gè)線程分配一塊內(nèi)存區(qū)域用于排序,稱之為sort_buffer 。
全字段排序過(guò)程
上述語(yǔ)句的排序過(guò)程如下:
排序過(guò)程的發(fā)生位置?
上述排序過(guò)程可能在內(nèi)存中完成,也可能需要使用外部排序,主要取決于排序所 需要的內(nèi)存 和 參數(shù)sort_buffer_size。
什么是sort_buffer_size?
sort_buffer_size是MySQL為排序開(kāi)辟的內(nèi)存大小,如果排序的數(shù)據(jù)量小于sort_buffer_size,排序就在內(nèi)存中進(jìn)行,相反內(nèi)存如果放不下的話,就需要借助磁盤(pán)臨時(shí)文件進(jìn)行排序。
如何查看是否使用了臨時(shí)文件進(jìn)行排序?
上圖來(lái)源于MySQL官網(wǎng):
rowid排序
上述的全字段排序優(yōu)點(diǎn)是在我們整個(gè)過(guò)程中我們只對(duì)原表數(shù)據(jù)掃描了一遍,其他都在sort_buffer或者臨時(shí)文件中進(jìn)行,但是全字段排序也有弊端:
MySQL如何知道需要使用rowid排序?
MySQL可以通過(guò)max_length_for_sort_data參數(shù)來(lái)進(jìn)行控制,如果單行的長(zhǎng)度超過(guò)該值,MySQL會(huì)認(rèn)為該行很大,需要切換到rowid算法。
rowid排序過(guò)程
根據(jù)索引直接返回
假設(shè)我們order by時(shí)有索引正好符合我們的要求,此時(shí)就不需要再借助內(nèi)存或臨時(shí)文件進(jìn)行排序,而是直接利用有序遍歷索引樹(shù)直接返回結(jié)果。
利用mysql proxy來(lái)實(shí)現(xiàn)的。 MySQL Proxy最強(qiáng)大的一項(xiàng)功能是實(shí)現(xiàn)“讀寫(xiě)分離(Read/Write Splitting)”?;镜脑硎亲屩鲾?shù)據(jù)庫(kù)處理事務(wù)性查詢,而從數(shù)據(jù)庫(kù)處理SELECT查詢。數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性查詢導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù)。
MYSQL主從同步原理:
1) MYSQL主從同步是異步復(fù)制的過(guò)程,整個(gè)同步需要開(kāi)啟3線程,master上開(kāi)啟bin-log日志(記錄數(shù)據(jù)庫(kù)增、刪除、修改、更新操作);
2) Slave開(kāi)啟I/O線程來(lái)請(qǐng)求master服務(wù)器,請(qǐng)求指定bin-log中position點(diǎn)之后的內(nèi)容;
3) Master端收到請(qǐng)求,Master端I/O線程響應(yīng)請(qǐng)求,bin-log、position之后內(nèi)容返給salve;
4) Slave將收到的內(nèi)容存入relay-log中繼日志中,生成master.info(記錄master ip、bin-log、position、用戶名密碼);
5) Slave端SQL實(shí)時(shí)監(jiān)測(cè)relay-log日志有更新,解析更新的sql內(nèi)容,解析成sql語(yǔ)句,再salve庫(kù)中執(zhí)行;
6) 執(zhí)行完畢之后,Slave端跟master端數(shù)據(jù)保持一致!
**MYSQL bin-log用途**
1) bin-log日志最大的功能記錄數(shù)據(jù)庫(kù)增、刪、改、插入等操作,記錄用戶操作的SQL語(yǔ)句;
2) bin-log日志可以用數(shù)據(jù)增量備份、完整備份;
3) bin-log還可以主要主從復(fù)制+讀寫(xiě)分離;
索引是一個(gè)單獨(dú)的、物理的數(shù)據(jù)庫(kù)結(jié)構(gòu),它是某個(gè)表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識(shí)這些值的數(shù)據(jù)頁(yè)的邏輯指針清單。
索引的作用相當(dāng)于圖書(shū)的目錄,可以根據(jù)目錄中的頁(yè)碼快速找到所需的內(nèi)容。
二叉樹(shù):當(dāng)不平衡時(shí),單邊增長(zhǎng),可能退化為線性
紅黑樹(shù):數(shù)據(jù)量大時(shí),深度不可控
AVL樹(shù):相比較與紅黑樹(shù),嚴(yán)格平衡,但是增刪情況下,通過(guò)旋轉(zhuǎn)再平衡的開(kāi)銷(xiāo)過(guò)大,適合查找場(chǎng)景多的應(yīng)用
Hash: 不支持范圍查找
平衡的多路查找樹(shù),一個(gè)結(jié)點(diǎn)存放多個(gè)元素。
與紅黑樹(shù)相比,在相同的的節(jié)點(diǎn)的情況下,一顆B/B+樹(shù)的高度遠(yuǎn)遠(yuǎn)小于紅黑樹(shù)的高度(在下面B/B+樹(shù)的性能分析中會(huì)提到)。B/B+樹(shù)上操作的時(shí)間通常由存取磁盤(pán)的時(shí)間和CPU計(jì)算時(shí)間這兩部分構(gòu)成,而CPU的速度非??欤訠樹(shù)的操作效率取決于訪問(wèn)磁盤(pán)的次數(shù),關(guān)鍵字總數(shù)相同的情況下B樹(shù)的高度越小,磁盤(pán)I/O所花的時(shí)間越少。
m階:節(jié)點(diǎn)中,子節(jié)點(diǎn)數(shù)的最大值(子節(jié)點(diǎn)數(shù),不是結(jié)點(diǎn)存放元素)
1. 樹(shù)中每個(gè)結(jié)點(diǎn)最多m個(gè)子樹(shù)(最多m-1個(gè)關(guān)鍵字,兩個(gè)子樹(shù)夾一個(gè)關(guān)鍵字)
2. 根節(jié)點(diǎn)最少有1個(gè)關(guān)鍵字
3. 非根結(jié)點(diǎn)最少m/2個(gè)子樹(shù)(m/2 - 1個(gè)關(guān)鍵字)
4. 每個(gè)關(guān)鍵字排序
5. 所有的葉子結(jié)點(diǎn)位于同一層
6. 每個(gè)結(jié)點(diǎn)都存有索引和數(shù)據(jù)
(1)簡(jiǎn)介
B+樹(shù)是應(yīng)文件系統(tǒng)所需而產(chǎn)生的一種B樹(shù)的變形樹(shù)(文件的目錄一級(jí)一級(jí)索引,只有最底層的葉子節(jié)點(diǎn)(文件)保存數(shù)據(jù))非葉子節(jié)點(diǎn)只保存索引,不保存實(shí)際的數(shù)據(jù),數(shù)據(jù)都保存在葉子節(jié)點(diǎn)中。所有的非葉子節(jié)點(diǎn)都可以看成索引部分!
(2)B+樹(shù)的性質(zhì)(下面提到的都是和B樹(shù)不相同的性質(zhì))
1. b+樹(shù)有兩種類型的結(jié)點(diǎn):
1.1 內(nèi)部結(jié)點(diǎn)(索引結(jié)點(diǎn),非葉結(jié)點(diǎn)): 只存索引,不存數(shù)據(jù)
1.2 葉子結(jié)點(diǎn) (存數(shù)據(jù))
2. 內(nèi)部結(jié)點(diǎn) 和 葉子結(jié)點(diǎn)的 key遞增排序
3. 每個(gè)葉結(jié)點(diǎn)存有相鄰葉結(jié)點(diǎn)的指針
4. 父結(jié)點(diǎn)存有右孩子第一個(gè)元素索引
1.磁盤(pán)io代價(jià)低:b+樹(shù)的非葉結(jié)點(diǎn)只存儲(chǔ)索引,不存儲(chǔ)數(shù)據(jù),單一結(jié)點(diǎn)能存放的索引數(shù)更多,樹(shù)更矮胖
2. b+樹(shù)查詢效率穩(wěn)定:所有查詢必須到葉節(jié)點(diǎn)
3. b+樹(shù)葉子節(jié)點(diǎn)為有序表,效率更高,支持范圍查詢。