【发布时间】:2010-12-03 13:57:59
【问题描述】:
我还有以下问题
EXPLAIN EXTENDED SELECT
`item`.`id`,
`item`.`timestamp`,
`item`.`label`
FROM
item
WHERE
item.dataTypeId=30
GROUP BY
item.id
ORDER BY
item.timestamp DESC
LIMIT 0,6;
Id & timestamp 是主键对(mediumint+datetime) dataTypeId 是外键(mediumint) 表被创建为 InnoDb
可以有更多具有相同 id 和不同时间戳的记录(同一项目的版本)。这就是 group by 的原因。
我读到了这个例子:similar topic on stackoverflow
但这并没有解决我的问题。
我尝试创建以下索引:
- (dataTypeId、id、时间戳)上的索引 - 按此顺序
- (dataTypeId,时间戳)上的索引 - 按此顺序
- id 上的索引
- 时间戳索引
最后两个有点绝望
我想我一定错过了一些基本的东西 -
但真的不知道是什么。
不要指望解决方案(这会很好:) 以正确的方式踢我 :)
sort_buffer_size 现在是 4194288
编辑: 解释 - 没有索引
"1" "SIMPLE" "item" "ref" "FK_dataTypeId" "FK_dataTypeId" "4" "const" "5608" "Using where; Using temporary; Using filesort"
解释创建的索引
"1" "SIMPLE" "item" "ref" "FK_udssDataItem_1,testIndexType,testIndexTypeTimestamp,testIndexTypeIdTime" "FK_udssDataItem_1" "4" "const" "5632" "Using where; Using temporary; Using filesort"
【问题讨论】:
-
文件排序不代表慢,请在EXPLAIN查询结果中抛出
-
跨 5000 行的查询需要 2 秒,我已将原始查询简化为最小大小 - 并逐步尝试,除了一个又一个可能的原因。 EXPLAIN 中唯一的“热点”是带有“文件排序”的。另一行通过行数较少的索引进行操作...
-
首先,您是按 id 分组,但您是按时间戳排序......这没有逻辑意义。您可能应该通过时间戳上的某个聚合函数 (AVG/MAX/MIN) 进行排序。
-
是的,但是顺序列可能会有所不同 - 还有更多 - 发布日期时间、上次更新日期时间等。这只是一个示例。
-
我的意思是 - 所有的列都是日期时间 - 我不确定是否 - 1)我有错误的索引,2)错误的配置
标签: mysql datetime innodb filesort