暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql匹配多个索引的时候是如何选择索引的

干货食堂 2023-02-08
1799

今天在查询的时候遇到的问题,表字段太多了,建了许多索引,但是查询条件很多,索引不可能每个都照顾到,所以在大数据量的时候一旦没有命中好索引就会导致很慢,不是没有命中索引,而是没有命中好索引。就是说匹配到了好几个索引,mysql会选择其中的一个索引来使用,但是mysql是如何选择的呢?我们来看一下。


先说一下结论:哪个索引区分度大,筛选更快就使用哪个

验证一下

来一张测试表

    CREATE TABLE `a` (
      `id` int(255DEFAULT NULL
      `index1` varchar(255DEFAULT NULL,
      `index2` varchar(255DEFAULT NULL
      KEY `index1` (`index1`),
      KEY `index2` (`index2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    INSERT INTO `a` VALUES ('1''aaa''ddd');
    INSERT INTO `a` VALUES ('1''a''ddd'); 
    INSERT INTO `a` VALUES ('0''aaa''dd');
    INSERT INTO `a` VALUES ('0''aaa''ddd');
    INSERT INTO `a` VALUES ('1''aa''ddd');
    INSERT INTO `a` VALUES ('1''aa''dd');
    INSERT INTO `a` VALUES ('1', 'xx', 'xx');
    复制


    现在测试一下sql语句

    测试1:EXPLAIN select * from a where index2 = "dd" and index1 = "aaa" ;

    结果:使用的是index2索引

    测试2:将查询条件的顺序换一下

    EXPLAIN select * from a where index2 = "dd" and index1 = "aaa" ;

    结果:还是使用的是index2索引

    接着我们看测试3:EXPLAIN select * from a where index1 = "aa" and index2 = "ddd" ;

    结果:发现使用的是index1索引,我换了一下条件内容怎么就变成index1索引了

    测试4,将查询条件顺序换一下:EXPLAIN select * from a where index2 = "ddd" and index1 = "aa" ;

    结果:发现还是使用的是index1索引

    那么mysql到底怎么选该使用哪个索引呢?

    我们看一下表里的数据,测试1和2的sql查询的是 index2 = "dd" and index1 = "aaa" 

    表里面只有两个index2=dd的数据,而index1=aaa的数据有三个,使用index2索引会直接将表里的数据筛选剩2个,而index1索引会将表里的数据谁选到3个。


    这样看哪个索引区分度大,筛选更快就使用哪个。

    我们再看测试3和4,index1 = "aa" and index2 = "ddd"

    aa有两个,而ddd有四个,所有使用index1索引。

    而当数据量相同时,按表中顺序使用第一个索引

    其实也可以强制使用索引。

    还是看之前的那个例子1。用的是index2索引,但是我们强制使用index1索引,就使用了我们指定的索引。


    csdn关注博主才能展开全文的绕过方法

    浏览器打开网页,DNS服务解析异常如何处理

    apache集合工具类的常用方法

    公钥、私钥、对称加密、非对称加密、混合加密、摘要、签名

    Selenium自动化测试框架



    文章转载自干货食堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论