联合索引与最左原则


联合索引了解不,最左侧匹配原则是啥?


  1. mysql联合索引 - 沧海一滴 - 博客园 (cnblogs.com)
  2. MYSQL | 最左匹配原则 - 一个人的孤独自白 - 博客园 (cnblogs.com)

联合索引

联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。

1
ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);

1、需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引
3、如果where条件中是OR关系,加索引不起作用
4、符合最原则

最左原则

当创建 (col1,col2,col3) 联合索引时,
相当于创建了 (col) 单列索引, (clo1,clo2) 联合索引以及 (col1,col2,col3)

联合索引想要索引生效,只能使用 col1col1,col2 和col1,col2,col3三种组合;

当然,col1,col3 组合也可以,但实际上只用到了col1 的索引,col3 并没有用到!

注意事项与示例

  • 查询语句中的where、order by、group 涉及多个字段,一般需要创建多列索引

    1
    select * from user where nick_name = 'ligoudan' and job = 'dog';
  • 一般情况下,把选择性高使用频率高的字段放在前面

    1
    2
    3
    select * from user where age = '20' and name = 'zh' order by nick_name;
    # 这时候如果建索引的话,首字段应该是age,因为age定位到的数据更少,选择性更高。
    # 但是务必注意一点,满足了某个查询场景就可能导致另外一个查询场景更慢。
  • 避免使用范围查询

  • 尽量避免查询不需要的数据,也就是尽量写明 select 列名 而不是 select *

    1
    2
    3
    4
    # 1.将会全表遍历
    explain select * from user where job like '%ligoudan%';
    # 2.可以使用覆盖索引
    explain select job from user where job like '%ligoudan%';
  • 查询的数据类型要正确

    1
    2
    3
    4
    # 可以使用create_date上的索引
    explain select * from user where create_date >= now();
    # 数据类型错误,使用不了索引
    explain select * from user where create_date >= '2020-05-01 00:00:00';

总结

  • 最左原则:在 InnoDB 中联合索引只有先确定了前一个(左侧的值)后,才能确定下一个值
  • 范围查询:如果有范围查询的话,那么联合索引中使用范围查询的字段后的索引在该条 SQL 中都不会起作用。
  • Mysql优化器:值得注意的是,in=可以乱序
    比如有索引(a,b,c),语句 select * from t where c =1 and a=1 and b=1
    这样的语句也可以用到最左匹配,因为 MySQL 中有一个优化器,他会分析 SQL 语句,将其优化成索引可以匹配的形式。
    select * from t where a =1 and a=1 and c=1

文章作者: SongX64
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 SongX64 !
  目录