聯合索引
所謂的聯合索引就是指,由兩個或以上的字段共同構成乙個索引。
本文測試用例的資料表結構如下,一張簡簡單單的學生資訊表 tb_student,僅包含四個字段(student_id、student_name、student_age、student_addr)
那比如說,我們現在的業務需求經常要通過學生的年齡(student_age)和學生的家庭住址(student_addr)來同時篩選學生,如下
select
*from tb_student where student_age =
20and student_addr =
'北京'
;
那此時我們就最好在 student_age 和 student_addr 這兩個欄位上同時設定索引(注意,這裡不是在這兩個列上各自設定乙個索引),這就是聯合索引,我們執行下面的 sql 語句來設定聯合索引。
設定索引的方式 :
alter table 表名 add index 索引名(列名…)
alter
table tb_student add
index test_index(student_age,student_addr)
;
最左字首匹配原則最左字首匹配原則,是乙個非常重要的原則,可以通過以下這幾個特性來理解。
這麼說還看不懂也沒關係,下面會我通過四個簡單的小例子來幫助你明白。
看例子之前,先要普及一下 explain 這個關鍵字的用法。
explain 是用來分析 select 查詢語句的,開發人員可以通過分析 explain 結果來優化查詢語句。文章接下來將會大量使用 explain 來觀察索引是否被使用到,我們先簡單的看乙個 explain 使用的小例子。
就用最簡單的,掃瞄 tb_student 全表。
select
*from tb_student
我們用 explain 分析一下
explain
select
*from tb_student
返回結果
注意我圈紅的這仨字段,這是使用 explain 語句需要重點關注的字段
好了,言歸正傳,現在開始兌現承諾,舉四個小例子了,還記得我們在上面剛給 student_age 和 student_addr 設定完聯合索引嗎,現在我們使用 explain 分析四種 where 子句的執**況。
一、where student_age = 10 and student_addr = '北京』
explain
select
*from tb_student where student_age =
10and student_addr =
'北京'
;
返回結果
ok,使用了索引。
二、where student_addr = 『北京』 and student_age = 10
跟第一種情況相比只是調換了順序。
explain
select
*from tb_student where student_addr =
'北京'
and student_age =
10;
返回結果
ok,還是正常。
三、where student_age = 10
沒問題四、where student_addr = '北京』
explain
select
*from tb_student where student_addr =
'北京'
;
返回結果
睜大眼睛,這就是最左匹配原則。
最左匹配原則的成因
mysql 建立聯合索引的規則是這樣的,它會首先根據聯合索引中最左邊的、也就是第乙個字段進行排序,在第乙個字段排序的基礎上,再對聯合索引中後面的第二個字段進行排序,依此類推。
綜上,第乙個欄位是絕對有序的,從第二個字段開始是無序的,這就解釋了為什麼直接使用第二字段進行條件判斷用不到索引了(從第二個字段開始,無序,無法走 b+ tree 索引)!這也是 mysql 在聯合索引中強調最左字首匹配原則的原因。
聯合索引和最左字首原則
1 也稱多列索引 復合索引。2 聯合索引就是把多個列按照順序放到乙個索引樹上。3 乙個索引上最多可以建16列。4 聯合索引可以看成排好序的陣列。排序規則是 先按照第乙個列進行排序,第二列再按照第一列排好序的基礎上再進行排序,依次類推 5 需要按照最左字首原則才能生效 最左字首原則 按照最左邊的列開始...
聯合索引最左字首
最左字首匹配原則 之所以會有最左字首匹配原則和聯合索引的索引構建方式及儲存結構是有關係的。首先我們建立的index bcd b,c,d 索引,相當於建立了 b b c b c d 三個索引,看完下面你就知道為什麼相當於建立了三個索引。我們看,聯合索引是首先使用多列索引的第一列構建的索引樹,用上面id...
索引最左字首原則
今天在觀察慢sql統計的時候,發現了乙個sql的平均耗時長,而且總的掃瞄行數大,分析對應表的ddl,發現此表中只有乙個唯一索引index1 a,b,c 但是在查詢條件中沒有帶上a欄位,導致這個查詢sql沒有走索引,從而導致了全表掃瞄。這裡涉及到乙個索引最左字首原則,我們來一起看一下。下述摘自 通常我...