联合索引了解不,最左侧匹配原则是啥?
联合索引
联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。
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)
联合索引想要索引生效,只能使用 col1
和 col1,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
3select * 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