【问题标题】:optimize subquery with count and order by field使用计数和按字段排序优化子查询
【发布时间】:2022-01-28 09:51:48
【问题描述】:

我希望优化下面的查询,该查询具有来自关系表的子查询,并按子查询计数数据排序。请参阅以下查询:

SELECT table1.*, 
       ( SELECT COUNT(*) 
         FROM table2 
         WHERE table2.user_id=table1.id 
           AND table2.deleted = 0) AS table2_total
FROM table1
WHERE table1.parent_id = 0 
ORDER BY table2_total DESC LIMIT 0, 50

此查询运行良好,但当 table2 的数据超过 50K 时它会卡住。我也尝试使用左连接而不是子查询,但这更慢:

SELECT table1.*, 
       COUNT(DISTINCT table2.id) as table2_total 
FROM table1 
LEFT JOIN table2 ON table2.user_id=table1.id 
                AND table2.deleted = 0
WHERE table1.parent_id = 0 
ORDER BY table2_total DESC LIMIT 0, 50

table2 已经在 user_id 和已删除列上有索引。请看下表2结构:

有什么方法可以更好地优化这个查询吗?

【问题讨论】:

  • 您需要 table1 的所有列还是需要某些特定列?
  • 我需要 table1 中的所有列 :)
  • 当您询问优化时,您必须提供精确的服务器版本,为所有表完成 CREATE TABLE 并为要优化的查询提供 EXPLAIN。至少。
  • 尝试通过table2 (deleted, user_id)创建索引。以防万一,创建一个索引table2 (user_id, deleted)。然后检查 EXPLAIN - 它们中的哪一个会被使用?
  • 显示这个。并解释。

标签: mysql sql


【解决方案1】:

正如写的那样,它将遍历整个table1,并多次探测table2。

将此复合索引添加到 table2:INDEX(user_id, deleted) 并删除您当前似乎拥有的 INDEX(user_id)

【讨论】:

    【解决方案2】:

    您可以尝试在table2.deleted 和table1.parent_id 列中添加索引。索引会影响插入的性能。

    【讨论】:

    • 索引会影响插入的性能。 (1)查询类型不是INSERT。 (2) 索引总是会降低 INSERT 性能。
    • 我知道,但只是说使用索引对插入性能有影响。
    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 2019-02-20
    • 2015-12-20
    • 2010-12-11
    • 2015-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多