高性能Mysql-讀書筆記-索引篇

索引篇

注:使用所有Mysql版本均為Mysql5.5以上,書上介紹的Mysql版本不超過5.0,所以書中部分內(nèi)容已被Mysql本身優(yōu)化,下面會具體說明。

1.Mysql只能高效利用多列索引的最左前綴列

PS:根據(jù)測試和網(wǎng)上查詢資料,只要使用Mysql最左前綴列即可。多列索引,where中索引字段順序與使用索引無關(guān),Mysql會自動優(yōu)化調(diào)整順序,使用全部索引字段查詢。

2.B+Tree索引適合全鍵值,鍵值范圍,鍵值最左前綴查找

3.多列索引在不使用索引最左列的時候無法生效 ??

PS:應(yīng)該是最容易被忽略的導(dǎo)致不走索引的情況

4.多列索引在跳過某列時,只能使用最左列索引

PS:在使用索引全部字段時,順序與索引使用情況無關(guān);但是在跳過中間部分索引列時,只能使用最左索引列,而且對查詢性能影響很明顯。

5.多列索引在某列存在范圍查詢時,其右邊所以列都無法使用索引查詢

6.索引將相關(guān)記錄放到一起為一星,索引數(shù)據(jù)順序和查詢順序一致為二星,索引包含查詢需要的全部列為三星

7.索引列不能參與表達式計算或者作為函數(shù)參數(shù)

PS: in, not in, != 在高版本Mysql中可以走索引,前提掃描數(shù)據(jù)列不超過全表20%

8.前綴索引應(yīng)該較長保證較高選擇性,且不過長節(jié)省空間。一般前綴索引基數(shù)應(yīng)該接近完整列基數(shù)

9.mysql5.0后引入索引合并,可以使用多個單列索引查詢

10.但這不代表單列索引可以替代多列索引,服務(wù)器對多個單列索引進行操作的時候,需要消耗大量CPU和內(nèi)存資源

PS:而且這部分優(yōu)化,是不會計算在解釋執(zhí)行計劃的開銷內(nèi)的,從而影響Mysql的最終執(zhí)行。在極端情況下,會出現(xiàn)走索引性能反而不如不走索引。

11.InnoDB主鍵索引即為聚簇索引,應(yīng)盡量避免隨機索引,如UUID

PS:mysql索引是順序存儲,自增ID的性能明顯好于隨機ID

12.順序主鍵在高并發(fā)下會造成明顯的爭用

13.索引覆蓋在數(shù)據(jù)量較大且命中率不高的情況下才有明顯性能提升

PS:查詢數(shù)據(jù)列全部為索引字段時,Mysql可以掃描到索引字段就停止查詢,不用再進行一次回表操作,減少IO來提升性能,稱為索引覆蓋

14.當(dāng)索引列順序和order by順序一致且所有列排序方向一致時才能使用索引排序

15.索引(A,B)和索引(A)是冗余索引,而索引(B,A)和索引(A)則不是

16.InnoDB沒有使用索引壓縮,而MyISAM使用了。例如select count(*)時,索引由(A)改為(A,B),InnoDB不會有明顯性能下降

17.應(yīng)盡量避免在選擇性低的列上建立索引

18.選擇性低的列為前綴列且查詢沒用到時,可以增加 where column in (...) 來讓查詢匹配索引

PS:比如索引最左前綴列為sex,但是要查詢?nèi)啃詣e的數(shù)據(jù),可以使用where sex in ('male', 'female') and age>17 這樣來保證查詢使用索引

19.盡量把需要范圍查詢的列放在索引最后面,以便優(yōu)化器能使用更多的索引列

20.可以使用延遲關(guān)聯(lián)先查詢主鍵,再關(guān)聯(lián)全部數(shù)據(jù)列,以優(yōu)化索引

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容