0

我仍然有以下问题

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 的原因

例如,我读过这个:stackoverflow 上的类似主题

但它没有解决我的问题。

我尝试创建以下索引:

  1. (dataTypeId, id, timestamp) 上的索引 - 按此顺序
  2. (dataTypeId, timestamp) 上的索引 - 按此顺序
  3. 身份证上的索引
  4. 时间戳索引

最后两个有点绝望

我想我必须错过一些基本的东西——
但真的不知道是什么。
不要指望解决方案(这会很好:) 以正确的方式踢我 :)

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"
4

2 回答 2

1

所以你的问题是“如何避免对你的查询进行文件排序”?
在这种情况下,要让 MySQL 进行索引排序,您需要在 where 子句中包含索引中的所有列。

使用 id,timestamp 主键,您必须

where id = myid and item.timestamp between (t1,t2)

还要注意开放式范围(和时间戳 < now() )

我不确定 datatypeID 是什么,但如果这是您唯一的条件,那么仅在该列上添加索引也应该建议索引排序。但您可能必须在 (timestamp,datatypeID) 上创建索引...按该顺序...代替。

于 2010-12-03T15:42:16.920 回答
1

您的查询有问题。当您执行“按 id 分组”时,您可能对同一个 id 有不同的时间戳,并且没有指定使用哪一个(Min()、max() 等)“标签”字段会出现类似的问题。

http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

因此,您需要时间戳和标签上的聚合函数,否则返回的值可能是不可预测的。

由于您按 id 分组并按时间戳排序,因此 MySQL 每组提取一个时间戳,因此索引并没有太大帮助。您可能无法使用此查询摆脱文件排序。

于 2010-12-03T16:46:44.357 回答