【发布时间】: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