【发布时间】:2019-01-12 00:47:27
【问题描述】:
SELECT notes.* FROM notes
WHERE notes.id IN (
SELECT T1.id
FROM notes as T1
WHERE (
SELECT COUNT(*)
FROM notes as T2
WHERE T2.category_id = T1.category_id
AND T2.created_at > T1.created_at
AND T1.user_id = T2.user_id
) < N
)
AND user_id = 2
此查询在按 created_at 排序的每个 category_id 中选择 N 行。 一切正常,直到:
1) 结果数 > 50,因为性能下降是线性的或更差:即使有索引,200 行也需要 2.6 秒。
2) 结果中显示了几个相等的 created_at 值。在这种情况下,您将在类别中获得超过 N 行。
主要问题是如何优化此查询,或者可以编写另一个具有相同功能的查询?特定 user_id 的 1000 行所需的性能为 0.5 秒。 第 2 点是可选的。性能是主要问题。 http://sqlfiddle.com/#!9/aa713f/3
解释:
1 PRIMARY notes
NULL
ref PRIMARY,user_id user_id 4 const 654 100.00
NULL
1 PRIMARY T1
NULL
eq_ref PRIMARY PRIMARY 4 admin_bt.notes.id 1 100.00 Using where
3 DEPENDENT SUBQUERY T2
NULL
ref category_id,created_at,user_id,catcrbabusr catcrbabusr 4 admin_bt.T1.category_id 1148 3.33 Using where; Using index
【问题讨论】:
-
你能提供相同的解释
-
1 PRIMARY notes NULL ref PRIMARY,user_id user_id 4 const 654 100.00 NULL 1 PRIMARY T1 NULL eq_ref PRIMARY PRIMARY 4 admin_bt.notes.id 1 100.00 使用 where 3 DEPENDENT SUBQUERY T2 NULL ref category_id,created_at,user_id ,catcrbabusr catcrbabusr 4 admin_bt.T1.category_id 1148 3.33 使用where;使用索引
-
请相应地编辑您的问题
标签: mysql sql optimization query-optimization greatest-n-per-group