指数的选择
(1)首先清除emp以上的所有索引,只保留主键索引!
请在emp上删除索引idx _ age _ deptid _ name
②查询:年龄30岁,员工数小于101000的用户,按用户名排序。
解释SELECT SQL _ NO _ CACHE * FROM EMP WHERE age = 30 AND empno <101000按姓名排序;
③全表扫描肯定是不允许的,要考虑优化。
思路:首先,你需要使用where过滤条件的索引;
在查询中,age.empno是查询的过滤条件,而name是排序字段,因此让我们创建这三个字段的复合索引:
在emp(age,empno,name)上创建索引idx _ age _ empno _ name
再次查询,发现使用filesort仍然存在。
原因:empno是范围查询,导致索引无效,所以名称字段不能按索引排序。
所以三个字段的匹配索引是没有意义的,因为empno和name字段只能选一个!
④解决方法:鱼与熊掌不可兼得。因此,您应该选择empno或name。
请在emp上删除索引idx _ age _ empno _ name
在emp(年龄,姓名)上创建索引idx _ age _ name
在emp(age,empno)上创建索引idx _ age _ empno
两个索引同时存在,mysql会选择哪个?
解释SELECT SQL _ NO _ CACHE * FROM EMP use index(idx _ age _ name)其中age =30,empno & lt101000按姓名排序;
原因:所有的排序都是在条件过滤之后执行的,所以如果大部分数据都是通过条件过滤来过滤的,那么对成百上千的数据进行排序并不会真正消耗性能。即使索引优化了排序,实际的性能提升也是有限的。相对empno
结论:在范围条件字段和分组依据或排序依据字段之间进行选择时,最好观察条件字段的筛选数量。如果过滤的数据足够多,但要排序的数据不多,最好将索引放在范围字段上。反之亦然。
本文来自夜遇投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/483126.html