【问题标题】:mysql count group by order by optimizationmysql count group by order by optimization
【发布时间】:2012-05-06 22:13:50
【问题描述】:

我有一张表要为posts 存储tag name

table: tagname
tags                    |  pid
festival                | 10034
New York Fashion Week   | 10034
festival                | 10035
car                     | 10036
...

该表现在已经有 590,000 条记录。现在我想从这个表中获取前 10 个最受欢迎的标签。

SELECT tags, COUNT(*) as Num FROM tagname
GROUP BY tags
ORDER BY Num DESC

这将花费 23.88 秒。返回358 kinds of tags

tags       |  Num
festival   |  7201
art        |  6988
gift       |  6755
...

如何优化这个查询,即使在my.cnf 中?我尝试为标签添加索引,似乎没有效果。

编辑: EXPLAIN SELECT tags, COUNT(tags) as Num FROMtagnameGROUP BY tags order by Num DESC

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE      tagname ALL     NULL    NULL     NULL    NULL   597649  Using temporary; Using filesort

【问题讨论】:

  • 你为列标签定义了什么数据类型?
  • @silly,标签 varchar(80),pid int(8)
  • 我认为最好的解决方案是为您的唯一标签字符串创建一个标签表......在 tag_name 表中,您可以只将 id 存储到新表中......
  • @cj333:它没有说Using index,所以要么您没有定义索引(如juergen 所建议的那样)或定义不正确(tags(10) ASC 表示只有前 10 个字符被索引)。您可以通过增加分配给 MySQL 的内存来消除 Using temporary
  • @Salman 是对的。删除tags(10) 索引并在tags 的全长上创建一个:ALTER TABLE tagname ADD INDEX tags_index (tags) ;

标签: mysql group-by sql-order-by


【解决方案1】:

为您的tags 列添加索引:

ALTER TABLE `tagname` 
ADD INDEX `tags_index` (`tags` ASC) ;

编辑:

尝试创建第二个索引

CREATE INDEX tags_pid_index ON tagname (tags, pid);

然后将您的查询修改为:

SELECT tags, COUNT(pid) as Num 
FROM tagname
GROUP BY tags
ORDER BY Num DESC

【讨论】:

  • 索引无效...仍然需要 20 多秒。
  • @cj333:那就试试COUNT(tags),而不是COUNT(*)
  • ALTER TABLE tagname` ADD INDEX tags_index (tags(10) ASC), SELECT tags, COUNT(tags) as Num FROM tagname GROUP BY tags ORDER BY Num DESC`, 21.16 秒。
  • 你能把EXPLAIN <your query>的输出贴出来看看是不是using temporary吗?
  • @cj333:在添加索引后添加查询的新解释。
【解决方案2】:

你有没有这样尝试过:

    SELECT tags, COUNT(*) as Num FROM tagname
    GROUP BY tags HAVING COUNT(*) > 1
    ORDER BY Num DESC LIMIT 10

诀窍可以是:如果知道最低人气数字,可以在 COUNT(*) > x 中更改数字

谢谢

【讨论】:

  • 最近,我遇到了同样的问题。一个解决方案可能是在 SQL 查询中省略 LIMIT 选项。而是在脚本级别对其进行排序。这些信息也可能对您有所帮助。这样我的脚本运行速度提高了 5 倍。
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多