MySql 查询优化器
Posted
技术标签:
【中文标题】MySql 查询优化器【英文标题】:MySql Query optimizer 【发布时间】:2021-05-12 20:57:35 【问题描述】:如果我有这样的查询
select * from student
inner join courses on courses.id = student.course_id
where student.gpa >= 3.0
order by student.gpa
limit 50;
mysql 将如何执行此查询以优化成本?
【问题讨论】:
运行一个解释,mysql会告诉你。 让你满意的答案是什么样的? 可以使用EXPLAIN查看估计的执行计划,使用EXPLAIN ANALYZE查看实际执行计划。 在哪个流中执行查询会先加入还是先运行 where 子句? @P.Salmon - EXPLAIN 会告诉你它在做什么,但不会告诉你可以改变什么来改进它。 【参考方案1】:以下索引可能会有所帮助:
CREATE INDEX idx ON student (gpa, course_id);
该索引将覆盖WHERE
子句,允许 MySQL 丢弃 GPA 小于 3.0 的任何记录。此外,它还涵盖了连接。
【讨论】:
为什么学生表比课程表小。如果这是一个大学数据库,那么学生肯定会更大。但是感谢关于在 where 子句列和外键上创建索引的提示。 此外,该索引将覆盖ORDER BY
,从而让它到达LIMIT
——因此它只会触及50行(并且不进行排序)。表大小和 FK 在这里不相关。更多讨论:mysql.rjweb.org/doc.php/index_cookbook_mysql以上是关于MySql 查询优化器的主要内容,如果未能解决你的问题,请参考以下文章