【发布时间】:2013-07-21 16:07:20
【问题描述】:
这个查询试图做一些 mysql 不容易做的事情,那就是限制每组的行数。 user_id's 的列表被传递给查询,并返回了一些,但组需要限制为每组 4 行。查询有效,但根据 Sequel Pro,200-500 毫秒的速度有点慢。
请在举报前继续阅读!!
SELECT id, user_id, article_id, row_number
FROM (
SELECT a2.id, a2.user_id, a2.post_id,
@num:= if(@group = a2.user_id, @num + 1, 1) as row_number
FROM (
SELECT a1.id, a1.user_id, a1.post_id
FROM articles as a1
WHERE a1.user_id IN (3,14,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,38,39,13,114,1111,12,223,2234,225,226,227,228,229,2210)
ORDER BY a1.date DESC
) as a2,
(SELECT @num := 0) t
) as f
WHERE row_number <= 4;
这个查询的解释是:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 10516 Using where
2 DERIVED <derived4> system NULL NULL NULL NULL 1
2 DERIVED <derived3> ALL NULL NULL NULL NULL 10516
4 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
3 DERIVED s1 ALL Reco... NULL NULL NULL 1180931 Using filesort
我曾考虑将其分解为多个查询,但我似乎仍然遇到将每个组结果限制为 4 个的问题。总而言之,我试图避免大量查询和昂贵的查询。
关于通过分解并将其中的一部分移动到应用程序中来提高此查询速度的最佳方法的任何想法?
【问题讨论】:
-
@MarcB 您立即对此进行了标记,但它不是重复的,我正在寻找通过 Baron Schwartz 提供的答案的替代解决方案。如果可能的话,我希望将繁重的工作从查询中转移到应用程序中。
-
你想按什么分组?您是否尝试获取每个用户最近 4 篇文章的列表?
-
@noz:查询有点奇怪,它非常奇怪。
-
问题中的查询不起作用(article_id 未定义)。解释与另一个查询有关(s1 来自哪里?)。
标签: php mysql optimization query-optimization greatest-n-per-group