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) ;

編集:

2 つ目のインデックスを作成してみる

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 に答える