4

我有一张桌子要tag name存放posts

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 FROM标记名GROUP 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
4

2 回答 2

2

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
于 2012-04-26T07:33:31.870 回答
1

你有没有试过这样:

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

诀窍可以是:如果您知道最小流行度数,则可以更改 COUNT(*) > x 中的数字

谢谢

于 2012-04-26T08:47:10.750 回答