我试图仅限制父行。 我有这个疑问
SELECT
comment.id user_id,
comment.comment,
comment.reply_id reply_id,
comment.user_id,
u.image image,
u.group gg2,
comment.edited,
comment.deleted,
u.id idd2,
g.verified verified,
comment.date,
u.login,
comment.news_id
FROM (SELECT c.*
FROM comments AS c
WHERE c.news_id = 16
ORDER BY c.id DESC
LIMIT 0, 15) AS base
LEFT JOIN comments AS comment ON (
comment.reply_id = base.id
OR comment.id = base.id
)
LEFT JOIN users u ON comment.user_id = u.id
LEFT JOIN groups g ON u.group = g.id
ORDER BY comment.id DESC
我只想限制 parent 而不是 child 。
此查询可以工作,但不是最佳的。 我有 400 万行,此查询需要 105.1980 秒。
我有reply_id、id、user_id和news_id的索引。 你能帮我优化一下吗?
示例 LIMIT 4 个家长 (reply_id):
+-------------+----------------------+----------+
| id | comment | reply_id |
+-------------+----------------------+----------+
| 1 | Sample Text | 0 |
| 2 | Sample Text | 0 |
| 3 | Sample Text | 0 |
| 4 | Sample Text | 0 |
| 5 | Sample Text | 1 |
| 6 | Sample Text | 1 |
| 7 | Sample Text | 4 |
| 8 | Sample Text | 2 |
| 9 | Sample Text | 3 |
| 10 | Sample Text | 3 |
+-------------+----------------------+----------+
最佳答案
限制这一点不会让它变得更快:comment_id 上的 order by 是性能的限制因素之一。
要添加限制:
SELECT
comment.id user_id,
comment.comment,
comment.reply_id reply_id,
comment.user_id,
u.image image,
u.group gg2,
comment.edited,
comment.deleted,
u.id idd2,
g.verified verified,
comment.date,
u.login,
comment.news_id
FROM (SELECT c.*
FROM comments AS c
WHERE c.news_id = 16
ORDER BY c.id DESC
LIMIT 0, 15) AS base
LEFT JOIN comments AS comment FORCE INDEX (idx_comment_nn_1) ON
comment.reply_id = base.id
OR comment.id = base.id
LEFT JOIN users u ON comment.user_id = u.id
LEFT JOIN groups g ON u.group = g.id
ORDER BY comment.id DESC
LIMIT 1;
添加此索引可能会加快速度:
CREATE INDEX idx_comment_nn_1 ON comments(id DESC);
解释计划必须向您展示它是否被使用。
关于mysql - 尝试限制父行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481824/