MySQL中的常見索引規則

2021-10-19 07:45:45 字數 2257 閱讀 9342

在使用索引規則的時候,會有乙個前置條件,就是索引的型別一般是聯合索引,至於為什麼要使用聯合索引,是因為資料的增刪改都會維護索引,所以過多的索引在方便我們快速查詢的時候,同時還會帶來一部分的效能問題。這時就需要使用到聯合索引了,聯合索引既能減少索引的數量,又能滿足我們查詢的需求

全值匹配規則

這個規則的使用需要我們在where條件的判斷中,根據聯合索引的順序來查詢,同時條件必須是等於

舉個例子,假如我們有一張表,主鍵就是id,還有name,age,email這些字段,假如我們建立了乙個name和age的聯合索引,那麼在查詢的時候,使用select * from table where name = 『張三』 and age = 20; 這樣的查詢語句就能使用到全值匹配規則

最左側列匹配規則

還是以上面的表為例,假設我們按照name,age,email的順序的順序建立了乙個聯合索引,要滿足最左側列匹配規則的話,我們在進行查詢的時候,就必須以name作為where條件的開頭,下面舉幾個例子

select * from table where name = 『張三』 and age = 20; 這種語句就能使用到我們的規則,因為是以最左側列作為開始查詢條件

select * from table where age = 20 and email = 『***@163.com』; 這種的語句就無法使用最左側列匹配規則,因為必須要以name作為查詢的初始條件

select * from table where name = 『張三』 and email = 『***@163.com』; 這條語句只有name能在索引中使用,而email無法使用到索引

這裡解釋一下原因,這也是聯合索引的查詢機制,如下圖所示

我們的聯合索引頁中包含了聯合索引中的字段和表的主鍵,同時索引頁向下指向我們的資料頁,資料頁儲存的就是具體的資料,索引頁中只是多個資料頁的最小主鍵值的記錄,資料頁和資料頁之間組成雙向鍊錶,裡面的資料之間組成單向鍊錶

資料頁中的資料都是有順序的,排序方式會按照聯合索引中的字段來排序,如圖所示,張三那條資料就排在李四那條資料之前,排過序的資料在最後的查詢過程中就可以基於二分查詢快速定位到具體的位置,那麼如果我們查詢的條件不是按照聯合索引的順序,或者是中間查詢字段出現了斷層,就會破壞索引本身維護的結構,導致無法使用索引或者部分使用到索引

最左字首匹配原則

這個規則一般使用在模糊搜尋的場景中,假設我們的查詢語句是 select * from table where name like 『%三』; 此時我們是沒法使用到索引的,而如果我們的sql是 select * from table where name like 『張%』; 這樣就可以使用到索引,我們需要保證在模糊查詢中最左側不使用%

範圍查詢規則

還是直接舉例子,select * from table where name > 『張三』 and name < 『王五』; 這條語句是可以使用到我們的聯合索引的,在資料頁中,直接找到name等於張三和王五的資料頁,然後直接取範圍內的資料即可,而如果sql是 select * from table where name > 『張三』 and age < 32; 這樣的話,前面的name範圍查詢可以使用到索引,後面的age就沒法使用到索引了

如果where條件中有範圍查詢的話,只有最左側列才能使用到索引

等值匹配 + 範圍匹配規則

這條規則其實是對上面乙個規則的補全,如果非要根據非最左側列進行範圍查詢,並且想要使用索引,還有乙個辦法,就是保證使用範圍查詢的列之前的字段都是等值匹配的,比如 select * from table where name = 『張三』 and age > 18; 這麼做的話資料頁中會先根據name精確定位到一些資料,再對這些資料進行範圍查詢,這樣就能使用到我們的索引了

除了上面常用的索引使用規則,還有一些特定場景下的索引使用技巧

比如說常見的order by排序,如果是隨便按照欄位的順序排序的話,可能就會導致資料進入到記憶體中,基於磁碟檔案來排序,恰巧此時資料又非常大的話,那麼速度肯定就很慢了

如果要使用到索引的話,可以按照我們之前說的聯合索引的順序來進行排序,因為聯合索引在資料頁中就根據資料的順序進行了排序,這樣能大大加快我們的查詢速度,同時在使用order by的時候,不要使用複雜的函式,也不要公升序降序一起使用

group by語句和order by語句一樣,也要注意到這些點才能順利使用到我們的聯合索引

mysql索引規則

1.最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢 between like 就停止匹配,比如a 1 and b 2 and c 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以...

MySQL 索引的使用規則

使用索引時的建議 索引的使用規則 建表create table staffs id int primary keyauto increment name varchar 24 not null default comment 姓名 age int notnull default 0comment 年...

MySql 索引的命中規則

在解釋索引命中規則的前提下,先了解一下如下原則 最左字首匹配原則,mysql會乙隻向右匹配直到遇到範圍查詢 between,like 就停止匹配,比如a 1 and b 2 and c 3 and d 4 如果建立了 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引,則...