Mysql联合索引失效,需注意索引的最左原则
生活随笔
收集整理的這篇文章主要介紹了
Mysql联合索引失效,需注意索引的最左原则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
聯合索引一直在用,沒想到今天栽了跟頭,聯合索引竟然還有最左原則(左前綴原則)這么一個說法,那什么是最左原則呢?
DROP TABLE IF EXISTS `gu_suo`; CREATE TABLE `gu_suo` (`ID` varchar(16) NOT NULL,`ADM_DIV_CODE` varchar(16) NOT NULL,`VOUCHER_NO` varchar(16) NOT NULL,`NAME` varchar(16) DEFAULT '',`AGE` varchar(16) DEFAULT '',KEY `ID` (`ID`,`ADM_DIV_CODE`,`VOUCHER_NO`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO gu_suo VALUES('1','530000','1234','小明','12'); INSERT INTO gu_suo VALUES('2','530000','1234','小張','13'); INSERT INTO gu_suo VALUES('3','530402','3333','小麗','14'); INSERT INTO gu_suo VALUES('4','530701','4444','小李','15'); INSERT INTO gu_suo VALUES('5','530000','3333','大白','15'); INSERT INTO gu_suo VALUES('6','530400','4444','紅中','14'); INSERT INTO gu_suo VALUES('7','530700','1233','東風','14'); INSERT INTO gu_suo VALUES('8','530921','1234','發財','13'); INSERT INTO gu_suo VALUES('9','530100','2223','門板','12');先創建一張表,插入幾條數據,該表聯合索引順序為?KEY `ID` (`ID`,`ADM_DIV_CODE`,`VOUCHER_NO`),即:
ID——a
ADM_DIV_CODE——b
VOUCHER_NO——c
我們先看這樣幾條語句:
SELECT * FROM gu_suo WHERE ID='1' AND ADM_DIV_CODE='530000' AND VOUCHER_NO='1234'; //abc順序 abc三個索引都在where條件里面且都發揮了作用SELECT * FROM gu_suo WHERE VOUCHER_NO='1234' AND ID='1' AND ADM_DIV_CODE='530000' ; //cab順序 效果同上==條件順序在查詢之前會被mysql自動優化SELECT * FROM gu_suo WHERE ID='1' AND VOUCHER_NO='1234'; //ac a用到索引b沒有 所以c是沒有用到索引效果的,看下圖:通過圖對比,不難看出聯合索引的最左原則,需要注意的是,聯合索引不同于使用兩個或多個單獨的索引,所以建立聯合索引時,順序特別重要,因為對索引中的所有列執行搜索或僅對前幾列執行搜索時,復合索引非常有用,但是如果僅對后面的任意列執行搜索時,復合索引則沒有用處,這就完全失去了復合索引的意義。之所以栽跟頭,就是在建表的過程中,對聯合索引的設計太過隨意,還好是在測試過程中及時發現問題。所以,在創建復合索引時應該將最常用的限制條件放在最左邊,依次遞減。
?
總結
以上是生活随笔為你收集整理的Mysql联合索引失效,需注意索引的最左原则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: r710 linux网卡驱动,Dell
- 下一篇: Python 之 = [:] copy