我们都知道在 MySql 中使用索引可以提高查询效率,但有时候真正执行Sql查询的时候却没有按照我们的预想使用索引,而是全表扫描,导致有慢Sql影响了整个网站的效率,甚至导致网站崩溃,所以我们需要了解Mysql是如何选择使用索引的,以便建立合适的索引 (本文基于MySql5.7,InnoDB引擎)
前提:建立一张测试表
假设有一张用户表
1 | 复制代码CREATE TABLE `test_user` ( |
我们建立了name,height,weight 的联合索引,插入测试数据
1 | 复制代码INSERT INTO `test_user` (`user_id`, `name`, `birthday`, `sex`, `height`, `weight`) |
执行什么操作的时候Mysql会使用索引
查找与WHERE子句匹配的行
1 | 复制代码select * from test_user where name='mary' |
查看执行计划
可见使用了idx_name_height_weight索引
从表中删除一行数据
1 | 复制代码 DELETE from test_user where name='mary'; |
查看执行计划
查找索引列的MIN()或MAX()的值
1 | 复制代码 SELECT MIN(height) FROM `test_user` |
这个和之前的执行计划不太一样,Select tables optimized away(选择要优化的表)实际就是优化到不能再优化的意思,在这种情况下,MySql把每个Key的MIN() 和 MAX()值替换成一个常量,如果查到了这个常量就立即返回,然后看下面的例子,分别在索引列上和非索引列上使用MIN()函数的执行计划:
1 | 复制代码 SELECT MIN(height) from `test_user` where height>=176 AND height<=190; |
1 | 复制代码 SELECT MIN(height) from test_user where sex=1; |
在索引列上执行 SORT 或 ORDER BY 操作
1 | 复制代码 SELECT name,height from test_user ORDER BY `name` DESC; |
注意SELECT的字段能匹配索引列,比如:
将会出现Using filesort,Using filesort 是Mysql里一种速度比较慢的外部排序,应当尽量避免
本文讲述了MySql什么时候会使用索引,下章说明什么时候MySql不能使用索引,敬请期待
本文转载自: 掘金