mysql 什麼時候用單列索引?什麼使用用聯合索引?
02-02
我一個表 students 表,有3個欄位 ,id,name,age 我要查詢 通過 name 和age,在這兩個欄位 是創建 聯合索引?還是分別在nage和age上創建 單列索引呢? 多個欄位查詢什麼情況下用聯合索引 什麼時候分別創建單列索引呢?
1,首先要確定優化的目標,在什麼樣的業務場景下,表的大小等等。如果表比較小的話,可能都不需要加索引。
3,記錄修改的時候需要維護索引,所以會有開銷,要衡量建了索引之後的得與失。
學生表,可以認為name的重複度比較小,而age的重複度比較大,對於單列索引來說,比較適合建在重讀度低的列上。
對於select * from students where name=張三』and age=18; 題主所說的兩種情況
一般來說mysql會選擇其中一個索引,name的可能性比較大,因為mysq會統計每個索引上的重複度,選用低重複度的欄位。另外一個age的索引就不會用到,但還有維護索引的開銷,所以age的索引不需要創建。
B. name和age的聯合索引
回過來看,有必要使用聯合索引嗎? 我的看法是沒有必要,因為學校里可能會有重名的人,但比較少。用name就可以比較精準的找到記錄,即使有重複的也比較少。
一個學生會選幾十個老師,一個老師會帶幾百個學生
相反如果只為teacher_id建立索引,經過索引會選出幾百條記錄,然後在內存中where一下,去除其餘的學生。
兩種情況都不是最優的,這個時候使用聯合索引最合適,通過索引直接找到對應記錄。
大學選任課老師的例子,分別給學生和老師建立索引與建立聯合索引有什麼區別呢?
可以考慮看下《高性能mysql》,有很詳細的解釋。
《MySQL性能優化》這本書可以幫助你。
推薦閱讀: