Using index, using temporary, using filesort - how to fix this?(使用索引,使用临时,使用文件排序 - 如何解决这个问题?)
问题描述
我正在开发一个事件跟踪系统,该系统使用少量查找表和主日志记录表.在我正在编写的报告中,可以选择一个对象来查看统计信息.界面按重要性递减的顺序显示所有对象(即点击数).
I'm working on a event tracking system which uses a handful of lookup tables as well as the primary logging table. In a report I'm writing, an object can be selected to view statistics against. The interface shows all objects in order of decreasing importance (ie, hits).
这两个表的架构(略有删减,但你明白了要点):
The schema for the two tables (slightly trimmed down, but you get the gist):
CREATE TABLE IF NOT EXISTS `event_log` (
`event_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(5) DEFAULT NULL,
`object_id` int(5) DEFAULT NULL,
`event_date` datetime DEFAULT NULL,
PRIMARY KEY (`event_id`),
KEY `user_id` (`user_id`),
KEY `object_id` (`object_id`)
);
CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
`object_id` int(11) NOT NULL AUTO_INCREMENT,
`object_desc` varchar(255) NOT NULL,
PRIMARY KEY (`object_id`)
);
我遇到的问题如下.它适用于我的约 100 个条目的表格,但 EXPLAIN 让我有点担心.
The query I'm having trouble with is below. It works fine with my table of ~100 entries, but the EXPLAIN worries me a little.
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 的查询有什么问题,可以依靠 temporary
和 filesort
?或者它是否像使用 ORDER BY 一样优化?
So -- what's wrong with my schema and/or query for MySQL to fall back on temporary
and filesort
? Or is it as optimized as it can get using ORDER BY?
推荐答案
好吧,文档 给出了出现使用临时"的确切原因:
Well, the doc gives the exact reasons when "Using temporary" will appear:
可以在以下条件下创建临时表:
Temporary tables can be created under conditions such as these:
如果有一个 ORDER BY 子句和一个不同的 GROUP BY 子句,或者如果ORDER BY 或 GROUP BY 包含表中的列,而不是加入队列中的第一个表,创建一个临时表.
If there is an ORDER BY clause and a different GROUP BY clause, or if the ORDER BY or GROUP BY contains columns from tables other than the first table in the join queue, a temporary table is created.
DISTINCT 结合 ORDER BY 可能需要临时表.
DISTINCT combined with ORDER BY may require a temporary table.
如果使用 SQL_SMALL_RESULT 选项,MySQL 使用内存中临时表,除非查询还包含元素(描述稍后)需要磁盘存储.
If you use the SQL_SMALL_RESULT option, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.
快速扫描显示您患有 #1.
A quick scan shows that you suffer from #1.
还有 这个博客 从 2009 年开始说使用文件排序"意味着不能使用索引执行排序.由于您是按计算域进行排序,因此也是如此.
And this blog from 2009 says that "using filesort" means that the sort can't be performed with an index. Since you're ordering by a computed field, that's going to be true, too.
所以,这就是错误".
这篇关于使用索引,使用临时,使用文件排序 - 如何解决这个问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用索引,使用临时,使用文件排序 - 如何解决这个问题?
基础教程推荐
- Sql Server 字符串到日期的转换 2021-01-01
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01