美文网首页数据结构
18.MySQL组合索引与最左匹配原则详解[高性能Mysql+网

18.MySQL组合索引与最左匹配原则详解[高性能Mysql+网

作者: 一枼落知天下 | 来源:发表于2019-08-04 13:04 被阅读0次

前言

之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。

什么时候创建组合索引?

当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

为什么不对没一列创建索引

  • 减少开销
  • 覆盖索引
  • 效率高

减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引
覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询

效率高:对col1、col2、col3三列分别创建索引,MySQL只会选择辨识度高的一列作为索引。假设有100w的数据,一个索引筛选出10%的数据,那么可以筛选出10w的数据;对于组合索引而言,可以筛选出100w10%10%*10%=1000条数据

最左匹配原则

假设我们创建(col1,col2,col3)这样的一个组合索引,那么相当于对col1列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引

创建测试表

CREATE TABLE `student` (
 `id` int(11) NOT NULL,
 `name` varchar(10) NOT NULL,
 `age` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_id_name_age` (`id`,`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

填充100w测试数据

DROP PROCEDURE pro10;
CREATE PROCEDURE pro10()
BEGIN
    DECLARE i INT;
    DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE return_str varchar(255) DEFAULT '';
    DECLARE age INT;
    SET i = 1;
    WHILE i < 5000000 do
        SET return_str = substring(char_str, FLOOR(1 + RAND()*62), 8);
        SET i = i+1;
        SET age = FLOOR(RAND() * 100);
        INSERT INTO student(id, name, age) values(i, return_str, age);
    END WHILE;
END;
 
CALL pro10();

场景测试

可以看到以下查询都使用到了索引

EXPLAIN SELECT * FROM student WHERE id = 2;

EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk';

EXPLAIN SELECT * FROM student WHERE id = 2 AND age = 8;

EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8;

可以看到如上查询也使用到了索引,id放前面和放后面查询到的结果是一样的,MySQL会找出执行效率最高的一种查询方式,就是先根据id进行查询

EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND id = 2;
EXPLAIN SELECT * FROM student WHERE age = 8 AND id = 2;
EXPLAIN SELECT * FROM student WHERE name = 'defghijk' and age = 8 AND id = 2;

可以看到该查询没有使用到索引,类型为index,查询行数为4989449,几乎进行了全表扫描,由于组合索引只针对最左边的列进行了排序,对于name、age只能进行全部扫描

EXPLAIN SELECT * FROM student WHERE name = 'defghijk' AND age = 8;

总结

如上测试,可以看到只要查询条件的列中包含组合索引最左边的那一列,不管该列在查询条件中的位置,都会使用索引进行查询

相关文章

  • 18.MySQL组合索引与最左匹配原则详解[高性能Mysql+网

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,...

  • 索引优化笔记!

    mysql最左匹配原则如果sql语句中用到了组合索引中的最左边的索引,那么就可以利用这个组合索引去进行匹配 mys...

  • 索引

    这道题目考察的知识点是MySQL组合索引(复合索引)的最左优先原则。 最左前缀匹配原则 在mysql建立联合索引时...

  • 索引失效的情况

    1、组合索引不遵循最左匹配原则 2、组合索引前面索引列使用范围查询(<,>,like),会导致后续的索引失效 3、...

  • mysql索引最左匹配原则的理解

    在读 【高性能MySQL(第3版)】在讲到如何正确使用 mysql 索引时,着重提到了一个最左匹配原则。今...

  • 11.MySQL组合索引的有序性

    组合索引的有序性和最左前缀原理【强制】理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于...

  • mysql组合索引

    组合索引:最左优先原则 如:组合索引(col_a,col_b,col_c) 使用到索引的情况如下: col_a =...

  • MySQL建索引、查询优化

    索引 最左前缀匹配原则非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)...

  • MySQL索引的数据结构

    建立索引的原则 最左前缀匹配原则 尽量选择重复度小的列 索引列不参与计算 尽量扩展索引,不要新建索引 索引的数据结...

  • Mysql语句优化的原则——让你写sql更加顺手

    使用索引的原则: 1.最左前缀匹配原则。 mysql会一直向右匹配直到遇到范围查询(>、<、between、lik...

网友评论

    本文标题:18.MySQL组合索引与最左匹配原则详解[高性能Mysql+网

    本文链接:https://www.haomeiwen.com/subject/adzedctx.html