mysql选择联合索引还是单索引?索引列应该使用哪一个最有效?深入測试探讨

先建表

 

CREATE TABLE `menu_employee` (

 `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键,无实际意义',

 `employee_pid` int(5) DEFAULT NULL COMMENT '父节点序号,通常是部门的序号,可是已有例外,没有组的员工',

 `employee_id` int(5) DEFAULT NULL COMMENT '员工序号,对应的部门序号+员工序号',

 `employee_name` varchar(100) DEFAULT '' COMMENT '员工名称',

 `action` varchar(100) DEFAULT NULL COMMENT 'action事件路径',

 PRIMARY KEY (`Id`),

  KEY`x` (`employee_id`,`employee_pid`) USING BTREE

) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULTCHARSET=utf8 COMMENT='员工表'

 

数据自己加入�.

 

 

好,開始測试:

 

 

写一个SQL,来跑一下试试

EXPLAIN

SELECT

       employee_name

FROM

       menu_employee

FORCE INDEX ( x )

WHERE

       employee_id> 3

AND

       employee_pid> 20

order by

   employee_pid

 

建一个索引,依照黄金律,把WHERE跟着了,一起建一个联合索引.

 

 

结果是:

是不是非常奇怪,明明了用了索引了,但是却依旧是 Using filesort!

 

好,接着我们改回单索引

 

 

再看结果:

 

是不是非常奇妙?

 

 

再试一下,那我们假设把索引列换成employee_id会肿么样呢,我们来试一试,

竟然没有什么效果,还是Using filesort!

 

单索引比复合索引有效果!并且还要选对要索引的列!

 

 

接下来说复合索引

 

先建表:

CREATE TABLE `l_insertlogs` (

 `ID` int(10) NOT NULL AUTO_INCREMENT,

 `Counts` int(10) DEFAULT NULL,

 `TablesName` char(30) DEFAULT NULL,

 `OperateTime` datetime DEFAULT NULL,

 PRIMARY KEY (`ID`),

  KEY`x` (`Counts`,`ID`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=6155 DEFAULTCHARSET=utf8

 

 

跑一下:

 

EXPLAIN

SELECT

       TablesName

FROM

       l_insertlogs

FORCE INDEX ( x )

WHERE

       IDbetween 100 and 500

AND

       Counts> 14

order by

  Counts

 

再来个索引,来一个复合双索引

 

结果一点也不好看

 

 

再试试,改成单的,用主键做列

 

还是不行

 

改成

 

这下即可了

 

 


所以说,双索引不一定有效,怎么使用要看实际情况,索引使用哪一列也是非常讲究的,这还是仅仅是表现,我还要接着深挖下去.

 

原文地址:https://www.cnblogs.com/hrhguanli/p/3812736.html