1.索引的作用
索引就是想是書的目錄,能夠幫助快速查詢。如果數據庫沒有索引的話,在查詢的時候,就會進行全表掃描,在數據量大的情況下(幾百萬,上千萬)的時候,查詢會特別慢需要幾秒,這個在線上系統是無法滿足應用要求的。加上索引後查詢只要幾十毫秒,百倍的優化。
索引建立的原則
用於索引的最好的備選數據列是那些出現在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。
大家看看ibatis/mybatis裡 where後面條件是什麼吧,優先考慮把他們創建成索引。
2. 索引的類型
我前面文章簡單分析了,基本的索引情況,大家可以看這裡,傳送門
- 主鍵索引:索引的順序就是物理存儲的順序【1步就能定位到數據,非常快】;
- 普通索引:保存了數據存放的指針,然後再根據指針地址獲取數據【分2步來查找數據】;
- 組合(聯合)索引:用於多字段組合查詢,最左前綴原則,組合、聯合、多列索引都是同一個不同說法而已。
- 唯一約束:可以在數據庫系統上保證數據上唯一約束,可以解決了多併發情況容易出現一些髒數據【先查在判斷是否有數據在插入情況】 ,可以保證數據冪等。
最左前綴原則 【面試也考】
顧名思義,就是最左優先
mysql會從左至右匹配,直到遇到範圍查找(> < like between)就停止。
如:
select * from table1 where a=1 and b=2 and c<3 and d=9 ;
建立的聯合索引為:(a,b,c,d) 實際使用的索引為(a,b,c)。因為遇到了c<3就停止了,d列就沒有用上。
聯合索引是有序元組【非常重要】
則mysql實際建的索引為:(a) (a,b) (a,b,c) (a,b,c,d) 【a就是前綴】。
如果你考慮給已經索引過的表添加索引,那麼就要考慮你將增加的索引是否是已有的多列索引的最左前綴【聯合索引】。
如果是這樣的,不用增加索引,因為已經有了 【小白們切記不要創建冗餘索引】
例子:where b=2 and c=3 and d=9 ;按照最左匹配原則,這個條件就沒法走索引了,首先必須有a
·where後面的 =,in可以亂序,查詢優化器會幫你優化成索引可以識別的形式。也就是說,where b=2 and a=1 and c<3
使用的索引任然為(a,b,c)組合。
注意點
- 小數據量表,沒必要建索引,這情況全表掃描最快。
- 選擇性越高的索引價值越大,這是由B+Tree的性質決定的, 選擇性是指不重複的索引值
- 在創建組合(聯合)索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。
Mysql索引會失效的幾種情況【面試喜歡問】
索引技術還有很多其他注意點,我先分析這麼多
歡迎一起來溝通
閱讀更多 程序汪汪 的文章