使用索引,使用临时,使用文件排序 - 如何解决这个问题?

我正在开发一个事件跟踪系统,该系统使用少量查找表和主日志记录表.在我正在编写的报告中,可以选择一个对象来查看统计信息.界面按重要性递减的顺序显示所有对象(即点击数).

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 的查询有什么问题,可以依靠 temporaryfilesort?或者它是否像使用 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.

所以,这就是错误".

相关文章