1. 程式人生 > >MySQL聯合索引

MySQL聯合索引

索引 基礎 找到 count 簡單 distinct update lec 技術分享

  1. 在一次查詢中,MySQL只能使用一個索引。
  2. 在真實項目中,SQL語句中的WHERE子句裏通常會包含多個查詢條件還會有排序、分組等。
  3. 若表中索引過多,會影響INSERT及UPDATE性能,簡單說就是會影響數據寫入性能。因為更新數據的同時,也要同時更新索引。
  4. 最實際的好處當然是查詢速度快,性能好。

使用聯合索引應該註意:

  1. MySQL使用聯合索引只能使用左側的部分,例如INDEX(a,b,c),當條件為a或a,b或a,b,c時都可以使用索引,但是當條件為b,c時將不會使用索引。這好比一本先根據姓,再根據名進行排序的電話簿,當查找的時候有姓的條件,效率會比沒有任何條件高;如果在姓的基礎上還有名的條件,效率會更高;但若只有名的條件,電話簿將不起作用

  1. 離散度更高的索引應該放在聯合索引的前面,因為離散度高索引的可選擇性高。考慮一種極端的情況,數據表中有100條記錄,若INDEX(a,b)中a只有兩種情況,而b有100種情況。這樣對於查詢唯一記錄a = …,b = …時,先遍歷全部索引看滿足a條件的有50個索引節點,接下來還要再一個個遍歷這50個索引節點。如果是INDEX(b,a),先遍歷全部索引發現滿足b條件的索引節點只有一個,再遍歷這個節點發現也滿足a條件。雖然最後都能找到那個唯一的索引節點,但是第二種索引順序對引擎遍歷索引效率有很大的提高(用電話薄的思想去思考問題)
  2. 查看列的離散程度:select count(distinct customer_id),count(distinct staff_id) from payment;

技術分享

customer_id列的離散程度更高,建聯合索引時應該INDEX(customer_id,staff_id);

MySQL聯合索引