另一个按 MySQL 查询顺序排列的组
Posted
技术标签:
【中文标题】另一个按 MySQL 查询顺序排列的组【英文标题】:Another Group by Order By MySQL Query 【发布时间】:2013-07-27 13:35:27 【问题描述】:我知道这已经被打败了 - 但我还没有看到一个真正有效的好答案。这是我的情况:我有以下查询:
SELECT items.item_name, sort_order as total_count, user_top_favorites.item_id.item_id
FROM user_top_favorites
INNER JOIN items ON user_top_favorites.item_id = items.item_id
WHERE user_top_favorites.user_id = 1
GROUP by user_top_favorites.item_id.item_id
ORDER BY sort_order asc
LIMIT 0 , 6
我尝试了以下指数:
user_sort (user_id, item_id, sort_order)
user_sort (item_id, user_id, sort_order)
user_sort (user_id, sort_order, item_id)
我总是得到:Using temporary; Using filesort
这里的正确索引是什么以避免临时和文件排序?
更新:
user_sort
只是我创建的索引的名称,该索引属于user_top_favorites
表。
【问题讨论】:
查询在limit和group by之前生成了多少行? 如果没有任何聚合函数,为什么还要使用组? 为什么user_sort
上的索引会对不使用该表的查询产生影响?
@GordonLinoff 这只是我标准的索引名称。
索引在哪个表上?您应该编辑问题以更正索引并解决其他 cmets。
【参考方案1】:
如果user_top_favorites
(user_id, sort_order
和items
(item_id
)中没有重复项,我认为您可以消除 group by
。您也可以选择前 6在join
之前。虽然这实现了一个表,但它太小了,不会影响性能。
SELECT i.item_name, utf.sort_order as total_count, utf.item_id.item_id
FROM (select utf.*
from user_top_favorites utf
where utf.user_id = 1
order by utf.sort_order
limit 6
) utf join
items i
ON utf.item_id = i.item_id
ORDER BY utf.sort_order asc;
如果您需要此查询,那么以下索引应该有助于提高性能:user_top_favorites(user_id, sort_order)
和 items(item_id)
。
如果你想冒险一点,你可以消除外部order by
。 mysql 不保证子查询的顺序,但我想你会在实践中按照你想要的顺序得到它们。但是,对 6 条记录进行排序确实需要很短的时间。
【讨论】:
以上是关于另一个按 MySQL 查询顺序排列的组的主要内容,如果未能解决你的问题,请参考以下文章