来源:自学PHP网 时间:2015-04-16 10:51 作者: 阅读:次
[导读] 先建表 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 再来个索引,来一个复合双索引 结果一点也不好看 再试试,改成单的,用主键做列 还是不行 改成 这下就行了 所以说,双索引不一定有效,怎么使用要看实际情况,索引使用哪一列也是很讲究的,这还是只是表现,我还要接着深挖下去. |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com