• 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

     

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

     

    结果一点也不好看

     

     

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

     

    还是不行

     

    改成

     

    这下就行了

     

     


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

     

  • 相关阅读:
    支付弹出窗口被拦截解决办法
    实现Bootstrap Carousel Fade Transition 淡入淡出效果
    SVN Global ignore pattern 忽略文件正则后缀
    css 不确定元素宽度的水平居中
    Android Studio运行程序,检测不到(夜神、Genymotion)模拟器
    HttpClient
    Eclipse中复制android项目后要改动的地方
    Eclipse快捷键
    Xml解析之PULL解析 例2
    Xml解析之PULL解析 例1
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314177.html
Copyright © 2020-2023  润新知