本博客是用來記錄本身學習的過程緩存
進行查詢的時,索引列不能是表達式的一部分,也不能是函數的參數,不然沒法使用索引服務器
例如user_id 爲索引列,改索引不能生效函數
select user_id from user where user_id +1 =3;性能
在須要使用多個列做爲條件進行查詢時,使用多列索引比使用多個單列索引性能會更好.學習
select user_id ,phone from user where user_id = 1 and phone = 138xxxxxxx優化
讓選擇性強的索引列放在前面。索引選擇性是指:不重複的索引值和記錄總數的比值。最大值爲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索引
對於列的值比較長,好比BLOB,TEXT,VARCHAR就必須創建前綴索引,就是把值的前一部分做爲索引。這樣既能夠節約空間,又能夠提升查詢效率。但沒法使用前綴索引作ORDER BY和 group BY,也沒法使用前綴索引作覆蓋掃描。內存
例如
alter table city add key(cityname(8))
跟聯合索引有點相似,就是在查詢Table的時候只用去讀取索引而取得數據,無需進行二次查詢相關表,這樣的索引的葉子節點上面也包含了他們索引的數據。(就是索引包含全部須要查詢的字段的值)
判斷標準:使用explain,能夠經過輸出的extra列來判斷,對應一個索引覆蓋查詢,顯示爲using index,MySQL查詢優化器在執行查詢前會決定是否有索引覆蓋查詢。
具備的優勢:
1.索引一般遠小於數據行的大小,只讀索引能大大減小數據訪問量。
2.一些存儲引擎(例如MyISAM)在內存中只緩存索引。而數據依賴於操做系統來緩存。所以,只訪問索引能夠不適用系統調用。
3.對於InnoDB引擎,若輔助索引可以覆蓋查詢,則無需訪問主索引。