【问题标题】:mysql order by count performancemysql 按计数排序
【发布时间】:2012-02-07 03:31:44
【问题描述】:

我发现以下内容有点令人困惑...如果我执行以下查询,按索引值“关键字”排序时需要 0.0008 秒,但按“计数”排序时需要 3 秒以上。

以下大约需要 0.0008 秒:

SELECT keyword, COUNT(DISTINCT pmid) as count 
    FROM keywords 
    WHERE (collection_id = 13262022107433) 
    GROUP BY keyword 
    order by keyword desc limit 1;

这需要 3 秒以上:

SELECT keyword, COUNT(DISTINCT pmid) as count 
    FROM keywords 
    WHERE (collection_id = 13262022107433) 
    GROUP BY keyword 
    order by count desc limit 1;

在按计数排序时,有没有一种方法可以加快对结果集的排序?真的需要更长的时间吗?有没有其他选择?引擎是 InnoDB。

非常感谢您的意见!

【问题讨论】:

    标签: mysql performance count sql-order-by


    【解决方案1】:

    您可能需要添加一个额外的索引来帮助计数阶段。

    ALTER TABLE keywords ADD INDEX ckp_index (collection_id,keyword,pmid);
    

    如果您已经有一个仅包含 collection_id 和关键字的复合索引,则查询优化器仍会包括从表中查找 pmid 字段。

    通过添加这个新索引,这将删除所有表扫描并仅执行索引扫描。

    这将加快查询的 count(distinct pmid) 部分。

    试试看!!!

    【讨论】:

    • 有趣的是,这确实有所作为。查询时间现在降至 0.2 秒!但是,如果我需要跨多个表执行类似的查询怎么办?对于每个可能的标准,跨不同表的索引?嗯……我会继续试验的!非常感谢。
    • 我正在分析一个运行时间长达 300 毫秒的查询,似乎 count(*) 或 count(column) 确实有所作为,我可以理解,但不是那么多。它减少到 130 毫秒。这是我不明白的问题(或者真的有时间查找它),如果我包装我的整个查询并将其用作子查询,我通过计数执行我的订单,它将时间减少到 34 毫秒。 . 也许当在 1 个查询中它试图对其进行排序时,而在一个子查询中它会查找它需要排序的出现,它之后也有一个限制,因此可能会从中受益
    • 很好,因为上面的covering index,它起作用了。但是如何解决多个表的连接问题? @RolandoMySQLDBA
    【解决方案2】:

    不意外,不可避免。当此查询按keyword 排序时,MySQL 可以只查看最后出现的关键字,挑选出具有该关键字的行并计算它们。但是,当您通过count 订购时,它必须计算每个关键字的行数,以确定哪个关键字最高。还有很多工作要做!

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2018-10-18
      • 2012-09-17
      • 2010-12-12
      • 2015-01-14
      相关资源
      最近更新 更多