mysql最左_Mysql最左原则
1. 前言
偶然看到一個技術群,對一道關于聯合索引的討論。面試題如下:
a_b_c_index 三列復合索引 a =1 and b<100 and c=5 這個查詢 會用到索引的那幾部分?
復制代碼
先說下個人經過本人查詢多方資料得到的結論, 只會用到 a 和 b部分(這里和群里小伙伴的討論結果一致,如果有疑問可以后續探討)。
2. 驗證
要驗證這個需要觀察explain結果中 key、key_len。key 代表用到的索引。key_len 代表索引使用的字節數,當索引的類型為int且默認值可以為null的時候,用到索引則key_len為4。
接下來是表結構:
CREATE TABLE `test` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`a` int unsigned NOT NULL DEFAULT '0',
`b` int unsigned NOT NULL DEFAULT '0',
`c` int unsigned NOT NULL,
`asda` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a_b_c_index` (`a`,`b`,`c`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
復制代碼
分別執行下面的sql。
explain SELECT * FROM test.test where a=2 and b=12 and c=12;
復制代碼
根據key_len和key兩個字段發現,該sql用到了索引的全部部分。
explain SELECT * FROM test.test where a=2 and b>12 and c=12;
復制代碼
其中key_len結果是8,說明只用到了,索引的兩個部分,但無法確認是abc中的哪些用到了索引。
explain SELECT * FROM test.test where a=2 and b>12;
復制代碼
其中key_len結果是8,說明a和b都用到了索引。
explain SELECT * FROM test.test where a=2 and c=12;
復制代碼
其中key_len結果是4,發現其中只有一個字段用到了索引。
explain SELECT * FROM test.test where c=12;
復制代碼
這里沒用到索引。
根據以上的結果,可以得到那個面試題的結論。只會用到 a 和 b部分用到了索引。
3. 總結
對于聯合索引最左原則的總結如下:
1.聯合索引的最左側列要在查詢語句中才能用到聯合索引。
2.查詢語句中,存在最左側連續的字段,且不能有范圍查詢的聯合索引部分會生效。
3.最左原則在遇到范圍查詢后,之后往右的字段,索引不生效。
總結
以上是生活随笔為你收集整理的mysql最左_Mysql最左原则的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: randn函数加噪声_语义分割中常用的损
 - 下一篇: LeetCode 889. 已知前序后序