什么是Mysql索引最左匹配原则?
最左匹配原则是指,在复合索引中,查询条件需要从左到右和索引开始依次完全匹配的时候,复合索引才可以被有效使用。因为联合索引在建立b+树的过程中是根据索引的顺序从左到右进行排序的,所以使用的时候需要遵循这个原则。
能否举例说明复合索引在查询时遵循最左匹配原则的情况
假设有(name,age,city)这个复合索引,那么查询语句就得是:
SELECT * FROM users WHERE name = 'Alice' AND age = 30;
才可以有效使用复合索引。
不过以下的查询虽然没有符合最左匹配原则但是也可以有效使用到复合索引,这是因为mysql有个优化器会调整顺序。
SELECT * FROM users WHERE age = 30 AND name = 'Alice';
当遇到范围查询(> ;<)的时候 会停止匹配。举个例子:
有联合索引(a,b,c)
where a>1, b=2, c=3; 因为a往后遍历,b,c的顺序在b+树的位置是无序的,无法充分使用联合索引。(但是这里会触发mysql5.6以后版本的一个功能:索引下推。下文中有提到,还是这个例子)
where a>=1, b=2 ;a=1的时候,利用联合索引快速定位到a=1,b=2这条数据,当a继续往下遍历的时候 无法使用b=2,而是遍历出所有数据后再进行过滤。(同样会触发索引下推)
where a=1,b=1,c>3 这个查询语句可以全部用上二级索引,因为当a=1,b=2的时候。c已经是有序的了。
假如你有一个查询很慢,但是你确定使用了复合索引。你会如何诊断并优化
首先来利用expiain语句来查看查询的执行计划,检查是否使用了正确的索引,如果发现没有充分利用索引,可以检查是否存在违反最左匹配原则,调整条件的顺序,减少返回的列数,使用覆盖索引等去优化。
mysql中的覆盖索引是什么?
覆盖索引就是查询的字段被全部包含在二级索引里面的情况,这个时候可以直接通过二级索引查出数据,不需要通过聚簇索引回表去查询其他数据。
举个例子:
假如现在有索引(name,age)
SELECT name,age FROM users WHERE name = 'Alice' (符合覆盖索引)
SELECT name FROM users WHERE name = 'Alice' (符合覆盖索引)
SELECT name,age,city FROM users WHERE name = 'Alice' (不符合覆盖索引,因为字段city不存在于二级索引(name,age)当中),需要回表去查询出city。
索引下推是什么
索引下推是mysql在5.6之后的版本支持的一个功能,在使用联合索引进行查询后回表再对where语句过滤 变成了 直接过滤再回表。减少了回表次数。本该由serve层过滤,现在由引擎层过滤如果使用了函数,表达式,聚簇索引的情况下无法生效。
where a>1, b=2, c=3; 查询过程中会在查询出a>1之后把原本在server层过滤 下推到引擎层过滤再传给server层。减少数据的传输量,减少回表的次数。