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

索引的使用條件

  • 對於很是小的表,大部分狀況下,簡單的全表掃描比創建索引更加高效
  • 對於中到大型的表,索引就很是有效
  • 可是對於特大型的表,創建和維護索引的代價會隨之增加,這種狀況下用到的一種技術就是區分出須要查詢的一組數據,而不是一條記錄一條記錄睇匹配。例如可使用分區技術。
相關文章
相關標籤/搜索