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联合索引失效,需注意索引的最左原则_第1张图片

通过图对比,不难看出联合索引的最左原则,需要注意的是,联合索引不同于使用两个或多个单独的索引,所以建立联合索引时,顺序特别重要,因为对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用,但是如果仅对后面的任意列执行搜索时,复合索引则没有用处,这就完全失去了复合索引的意义。之所以栽跟头,就是在建表的过程中,对联合索引的设计太过随意,还好是在测试过程中及时发现问题。所以,在创建复合索引时应该将最常用的限制条件放在最左边,依次递减。

 

你可能感兴趣的:(Mysql)