mysql - 尝试限制父行

标签 mysql rows

我试图仅限制父行。 我有这个疑问

    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/

相关文章:

mysql - 删除该键的记录后,自动重新分配 MySql 表中主键的值

mysql - 如何为两个不同实体之间的复杂消息传递系统设计表?

c# - WPF、C#、SQL - 在数据库中创建行

parsing - Talend - 合并定界文件的两行以获得一个寄存器

mysql - 如何计算 SQL 查询中列中的行数?

mysql - 替换mysql中多个表中的多个字符串

mysql - 如何在 SQL 中查找一列上的元素以查找其他列中间隙不超过 3 个的值

sql - 为多个数据集构建 "notes"表的正确方法?

替换数据框中的特定行

Mysql:通过选择每第 n 行需要帮助