1,首先要確定優化的目標,在什么樣的業務場景下,表的大小等等。如果表比較小的話,可能都不需要加索引。
2,哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。
3,記錄修改的時候需要維護索引,所以會有開銷,要衡量建了索引之后的得與失。
學生表,可以認為name的重復度比較小,而age的重復度比較大,對於單列索引來說,比較適合建在重讀度低的列上。
對於select * from students where name='張三’and age=18; 題主所說的兩種情況
A. name 和 age 各自單獨建立索引。
一般來說mysql會選擇其中一個索引,name的可能性比較大,因為mysq會統計每個索引上的重復度,選用低重復度的字段。另外一個age的索引就不會用到,但還有維護索引的開銷,所以age的索引不需要創建。
B. name和age的聯合索引
這種索引的切合度最好,mysql會直接選用這個索引。但相對單獨的name索引來說,維護的成本要大一些,並且索引數據占用的存儲空間也要更大一些。
回過來看,有必要使用聯合索引嗎? 我的看法是沒有必要,因為學校里可能會有重名的人,但比較少。用name就可以比較精准的找到記錄,即使有重復的也比較少。
什么情況下使用聯合索引比較好呢? 舉一個例子,大學選認課老師,需要創建一個關系對應表,有2個字段,student_id 和 teacher_id,想要查詢某個老師和某個學生是否存在師生關系。
一個學生會選幾十個老師,一個老師會帶幾百個學生
如果只為student_id建立索引的情況下,經過索引會選出幾十條記錄,然后在內存中where一下,去除其余的老師。
相反如果只為teacher_id建立索引,經過索引會選出幾百條記錄,然后在內存中where一下,去除其余的學生。
兩種情況都不是最優的,這個時候使用聯合索引最合適,通過索引直接找到對應記錄。
作者:范孝鵬
鏈接:https://www.zhihu.com/question/40736083/answer/88191544
來源:知乎