使用索引、使用临时、使用文件排序:您的 MySQL 查询需要优化吗?
从数据库表中检索数据时,至关重要编写有效的查询,最大限度地减少处理时间和资源消耗。 MySQL 提供了各种优化技术来促进更快的查询执行,但有时,查询仍然会表现出次优的行为。在本例中,我们将探索在 EXPLAIN 输出中返回“使用索引;使用临时;使用文件排序”的查询。
让我们检查提供的查询:
explain SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC, leo.object_desc ASC
理解“使用临时表”
MySQL 文档指出,当 ORDER BY 和 GROUP BY 子句之间存在差异,或者当 ORDER BY 或 GROUP BY 包含表中的列时,可以创建临时表除了连接队列中的第一个表之外。在此查询中,我们满足了两个条件。 ORDER BY 子句按 count_rows(计算字段)排序,GROUP BY 子句按来自不同表的 el.object_id 进行分组。因此,使用临时表来促进排序和分组过程。
理解“使用文件排序”
由于排序是在计算字段 count_rows 上执行的,索引不能用于此操作。因此,MySQL 求助于使用文件排序,即从磁盘读取数据并在内存中排序,然后返回结果。
优化查询
以提高性能为了避免这个查询并消除临时表和文件排序的使用,我们可以考虑创建一个适当的索引,例如:
CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));
这个索引将允许MySQL直接检索每个object_id的事件计数,消除需要临时表和文件排序。
以上是为什么我的 MySQL 查询使用“使用索引;使用临时;使用文件排序”?的详细内容。更多信息请关注PHP中文网其他相关文章!