innodb索引使用

  • 本文針對的是mysql的innodb數據引擎來談,innodb使用的是b+tree進行存儲,數據存放在子節點上
  • 索引分成兩類:聚集索引、輔助索引
    • 聚集索引:數據存放在聚集索引的葉子節點上,聚集索引依據主鍵進行順序排序。在innodb中數據存儲在聚集索引上
    • 輔助索引:除聚集索引外的索引,在innodb中葉子節點上存放的是主鍵,可以通過主鍵在聚集索引上找到對應的數據
  • 數據頁:頁是innodb中數據存儲的最小單位,默認16k。每次查詢都是以頁來進行查詢的,所以如果一頁中能容乃的數據足夠多,則可以減少io

這篇文章寫的相當好:https://blog.csdn.net/IFollowRivers/article/details/73614549
聚集索引和輔助索引:https://blog.csdn.net/biexiaofei/article/details/78261273

innodb中必須有一個主鍵

  • 在innodb中的數據是按照主鍵的順序來組織,如果沒有主鍵則是第一個非空索引。如果以上都沒有則innodb會自己創建出一個隱藏的鍵來進行排序,但是性能不是最優的。
  • 頻繁更新的列不能作爲主鍵
  • 不要使用uuid、md5作爲主鍵(uuid md5都不能保證順序增加,可能導致頁分解)
  • 建議增加自增列做主鍵

哪些列增加索引

  • select、update、delete、where中的字段
  • order by、group by、distinct中的字段
  • 多表join關聯列

多列索引如何決定順序

  • 選擇性高的放在最左邊
  • 長度小的列放在左側(單頁可以容納的數據更多,減少io)
  • 使用最頻繁的放在左側

多索引生效

  • 對於組合索引可以這樣理解:組合索引(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的
  • 組合索引的生效原則是最左前綴原則:從前往後依次使用生效,如果中間某個索引沒有使用(或者使用了範圍查詢),那麼斷點前面的索引部分起作用,斷點後面的索引沒有起作用
  • 組合索引 (a,b,c)和 (a,c,b)不同
-- 針對a,b,c組合索引
select * from mytable where  c=4 and b=6 and a=3;--where裏的都能生效
select * from mytable where a=3 and b>7 and c=3;--where中a,b用到了索引,c沒有,範圍查詢也算一個斷點
select * from mytable where a=3 order by c;--a用到索引,c沒有
select * from mytable where b=3 order by a;--都沒有用到索引
select * from mytable where a=3 order by b;--a用到索引

多索引生效規則:https://www.cnblogs.com/codeAB/p/6387148.html

索引冗餘和重複

  • 冗餘:primary key(a), index(a), unique index(a) 三種不一樣的東西但是效果相同
  • 重複:index(a,b), index(a,b,c)

對於頻繁的查詢首先考慮覆蓋索引

  • 在innodb中可以避免二次查找,只需要在輔助索引上就可以完成查詢
  • 二次查找會在聚合索引上查找,將使用隨機io。因此索引覆蓋可以把隨機io變爲順序io。

避免使用外鍵約束,但是要在外鍵上建立索引

  • 存在外鍵,則每一個插入刪除都需要檢查外鍵約束,影響效率。數據的完整性可以再程序中保證
  • 但是join的列必須要有索引
  • 有外鍵不能使用truncate table,只能delete
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章