mysql选择联合索引还是单索引?索引列应该使用哪

页面导航:首页 > 数据库 > Mysql > mysql选择联合索引还是单索引?索引列应该使用哪

mysql选择联合索引还是单索引?索引列应该使用哪

来源: 作者: 时间:2016-01-28 09:19 【

先建表 CREATE TABLE `menu_employee` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键,无实际意义 , `employee_pid` int(5) DEFAULT NULL COMMENT 父节点序号,一般是部门

先建表

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

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

结果一点也不好看 

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

还是不行

改成

这下就行了

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

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<