改进评论的2层层次

时间:2017-05-06 17:36:01

标签: mysql performance

有一个表格,其格式为

|  ID  |ID_PARENT| ...

如果父级等于0,那么它是根注释,子级引用父母。

仅有2个级别的评论层次结构。所以,家长评论和所有答案都是第二级。

目前在2个查询中选择:

  • 父母通过id(自动增量)第一次

    select id, txt
    from comments
    where id_parent = 0
    order by id desc limit 500
    
  • 然后第一个查询中的所有id都存储在数组中,并且查询子项是,即

    select id, txt, id_parrent
    from comments
    where id_parent in (58286, 55857, 54242, 53937, 53770, 52825, 51765, 51204, 50996, 50810, 44735, 43680, 43576, 42336, 41440, 41157, 39715, 38973, 38614, 36560, 36331, 36099, 35819, 35280, 33950, 33607, 33503, 32802, 30689, 27807, 27712, 26821, 25895, 23927, 23485, 23433, 22709, 22706, 22252, 21203, 20293, 20041, 19824, 19619, 19560, 19233, 17209, 17129, 16879, 16822, 16602, 14060, 13992, 13986, 13137, 13074, 12294, 10729, 10698, 10690, 10689, 10687, 10679, 10677)
    order by id_parent desc, id asc
    

然后从第二次查询结果中选择子项的父项进行迭代。 有时候会有500个身份证,看起来很糟糕......

有可能进行优化吗?

1 个答案:

答案 0 :(得分:0)

以下查询应该在1 go中获取所有这些注释,并按父项在id顺序之前排序。

SELECT case when parent_id = 0 
THEN parent_id
ELSE id
END as sort_id, comments.* FROM comments ORDER BY sort_id, parent_id, id ASC

这是你想要做的吗?

如果您可以访问保存内容的方式,并且可以将parent_id值更改为NULL(当它是顶级注释时),则可以通过执行以下操作来更快地执行此查询:

SELECT IFNULL(parent_id, id) as sort_id, comments.*
FROM comments ORDER BY sort_id, parent_id, id ASC