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 查询优化器的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询优化器工作原理解析

MySql性能优化查询优化

Mysql优化系列之——优化器对子查询的处理

MySql 查询优化器

010 --MySQL查询优化器的局限性

mysql查询优化器的提示(hit)