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

两个表的架构(略有减少,但您能理解以下要点):

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让我有些担心。
    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

返回值:Using index; Using temporary; Using filesort
所以-我的架构和/或查询MySQL依赖temporaryfilesort怎么了?还是使用ORDER BY获得的优化?

最佳答案

好吧,the doc给出了“使用临时”出现时的确切原因:



快速扫描显示您患有#1。

2009年的this blog说“使用文件排序”意味着无法使用索引执行排序。由于您要按计算字段排序,所以这也将是正确的。

因此,这就是“错误”。

07-24 09:45
查看更多