联合索引一直在用,没想到今天栽了跟头,联合索引竟然还有最左原则(左前缀原则)这么一个说法,那什么是最左原则呢?
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是没有用到索引效果的,看下图:
通过图对比,不难看出联合索引的最左原则,需要注意的是,联合索引不同于使用两个或多个单独的索引,所以建立联合索引时,顺序特别重要,因为对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用,但是如果仅对后面的任意列执行搜索时,复合索引则没有用处,这就完全失去了复合索引的意义。之所以栽跟头,就是在建表的过程中,对联合索引的设计太过随意,还好是在测试过程中及时发现问题。所以,在创建复合索引时应该将最常用的限制条件放在最左边,依次递减。