mysq l單列索引 or 聯合索引

2021-08-09 07:18:36 字數 1050 閱讀 4004

在使用資料庫的時候會經常使用到索引,單列索引是最常見、使用最多的,但是我們也經常遇到需要使用聯合索引的場景,下邊簡單說明如何抉擇使用何種索引。

1,首先要確定優化的目標,在什麼樣的業務場景下,表的大小等等。如果表比較小的話,可能都不需要加索引;

2,哪些字段需要建索引,一般都where、order by 或者 group by 後面的字段;

3,權衡索引的利弊,記錄修改的時候需要維護索引,所以會有開銷,要衡量建了索引之後的得與失。

以學生表為例,包含三個字段:id, name, age

可以認為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一下,去除其餘的學生。

兩種情況都不是最優的,這個時候使用聯合索引最合適,通過索引直接找到對應記錄。

MySQL單列索引和聯合索引

所有的mysql列型別能被索引。在相關的列上的使用索引是改進select操作效能的最好方法。乙個表最多可有16個索引。最大索引長度是256個位元組,儘管這可以在編譯mysql時被改變。對於char和varchar列,你可以索引列的字首。這更快並且比索引整個列需要較少的磁碟空間。在create tab...

MySQL單列索引和聯合索引

mysql單列索引和聯合索引 所有的mysql列型別能被索引。在相關的列上的使用索引是改進select操作效能的最好方法。乙個表最多可有16個索引。最大索引長度是256個位元組,儘管這可以在編譯mysql時被改變。對於char和varchar列,你可以索引列的字首。這更快並且比索引整個列需要較少的磁...

MySQL單列索引和聯合索引

mysql單列索引和聯合索引 所有的mysql列型別能被索引。在相關的列上的使用索引是改進select操作效能的最好方法。乙個表最多可有16個索引。最大索引長度是256個位元組,儘管這可以在編譯mysql時被改變。對於char和varchar列,你可以索引列的字首。這更快並且比索引整個列需要較少的磁...