總結自:https://blog.csdn.net/weixin_39420024/article/details/80040549mysql
前提:每次查詢都只能使用一個索引sql
緣由:比起全表掃描,分析兩個索引B+表更耗時函數
什麼時候須要索引?spa
一、所查詢字段是主鍵(主鍵能夠認爲是索引).net
二、和其餘表作鏈接查詢的字段blog
三、在where裏使用>、≥,=,<,≤,<>,is null和between等字段索引
四、不以通配符開始的like,如'aa%'字符串
五、彙集函數max()、sum()等使用得字段im
六、order by和group by的字段總結
什麼時候不須要索引?
一、表記錄不多
二、數據重複且分佈平均
三、常常插入、刪除、修改的表
四、text、image等數據量大的類型
五、特殊狀況,有時mysql會估算這次查詢,全表掃描比使用索引更爲省時,則不會使用索引
索引錯誤使用情形總結:
一、組合索引未使用最左前綴,例如:組合索引(a,b),而查詢條件是where b="1"
二、like通配符在最左邊,例如:where a like '%aa'
三、在查詢條件中使用索引,order by裏也使用索引,例如:where a='1' order by b,由於每次查詢只會使用一個索引,這裏只會使用a的索引
四、or會使得索引失效,例如:where a= 1 or b=2
特殊狀況:若or兩邊的條件使用的字段同樣,索引依舊會有效,例如:where a=1 or a=2
五、若是列類型是字符串,要使用引號。例如where A='China',不然索引失效(會進行類型轉換)
六、在索引列上的操做,函數(upper()等)、or、!=(<>)、not in等