MySQL--MySQL索引優化

1.獨立的列

進行查詢的時,索引列不能是表達式的一部分,也不能是函數的參數,否則無法使用索引

例如user_id 爲索引列,改索引不能生效

select user_id from user where user_id +1 =3;

2.多列索引

在需要使用多個列作爲條件進行查詢時,使用多列索引比使用多個單列索引性能會更好.

select user_id ,phone from user where user_id = 1 and phone = 138xxxxxxx

3.索引列的順序

讓選擇性強的索引列放在前面。索引選擇性是指:不重複的索引值和記錄總數的比值。最大值爲1,此時每個記錄都有唯一的索引和它對應。選擇性越高,查詢效率也越高。

例如,從顯示結果來看customer_id的值比company_id的值大,因此最好把customer_id 放在多列索引前面

SELECT COUNT(DISTINCT company_id)/COUNT() AS company_id_selectivity, COUNT(DISTINCT customer_id)/COUNT() AS customer_id_selectivity, COUNT(*) from customer a

4.前綴索引

對於列的值比較長,比如BLOB,TEXT,VARCHAR就必須建立前綴索引,就是把值的前一部分作爲索引。這樣既可以節約空間,又可以提高查詢效率。但無法使用前綴索引做ORDER BY和 group BY,也無法使用前綴索引做覆蓋掃描。

例如

alter table city add key(cityname(8))

5.覆蓋索引

跟聯合索引有點類似,就是在查詢Table的時候只用去讀取索引而取得數據,無需進行二次查詢相關表,這樣的索引的葉子節點上面也包含了他們索引的數據。(就是索引包含所有需要查詢的字段的值)

判斷標準:使用explain,可以通過輸出的extra列來判斷,對應一個索引覆蓋查詢,顯示爲using index,MySQL查詢優化器在執行查詢前會決定是否有索引覆蓋查詢。

具有的優點:

1.索引通常遠小於數據行的大小,只讀索引能大大減少數據訪問量。

2.一些存儲引擎(例如MyISAM)在內存中只緩存索引。而數據依賴於操作系統來緩存。因此,只訪問索引可以不適用系統調用。

3.對於InnoDB引擎,若輔助索引能夠覆蓋查詢,則無需訪問主索引。

索引的優點

  • 大大減少了服務器需要掃描的數據行數

  • 幫助服務器避免進行排序和分組,以及避免創建臨時表(B+ tree 的索引是有序的,可以用於ORDER BY 和 GROUP BY操作。臨時表主要是在排序和分組過程中創建,因爲不需要排序和分組,也就不需要創建臨時表)

  • 將隨機啊I/O變成順序I/O

索引的使用條件

  • 對於非常小的表,大部分情況下,簡單的全表掃描比建立索引更加高效

  • 對於中到大型的表,索引就非常有效

  • 但是對於特大型的表,建立和維護索引的代價會隨之增長,這種情況下用到的一種技術就是區分出需要查詢的一組數據,而不是一條記錄一條記錄睇匹配。例如可以使用分區技術。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章