zoukankan      html  css  js  c++  java
  • 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

     

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

     

    结果一点也不好看

     

     

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

     

    还是不行

     

    改成

     

    这下即可了

     

     


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

     

  • 相关阅读:
    Linux常用命令
    jq实现全选,全取消,反选
    apache httpd.conf配置文件详解
    Python Django 商城项目总结
    Python练习题(九)
    Python练习题(八)
    Python练习题(七)
    Python练习题(六)
    Python练习题(五)
    Python练习题(四)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3812736.html
Copyright © 2011-2022 走看看