1

ポストのようなステータスを保持するテーブルがあります。表の列は次のとおりです。

ID        //which is unique incremental
Post_id   //liked post
user_id   //user who gave like or dislike
type      //"1","0" or "2" which stands for Liked, neutral or disliked.

ここにサンプルデータがあります

+--------+---------+---------+------+
| id     | post_id | user_id | type |
+--------+---------+---------+------+
| 938300 |  347298 |     661 |    0 |
| 938299 |  346185 |       0 |    1 |
| 938298 |  347286 |    2645 |    0 |
| 938297 |  346924 |     374 |    1 |
| 938296 |  347261 |    1523 |    1 |
| 938295 |  347313 |    3233 |    1 |
| 938294 |  346323 |    1375 |    1 |
| 938293 |  347022 |    1779 |    1 |
| 938292 |  347278 |    2645 |    1 |
| 938291 |  347300 |     109 |    1 |
+--------+---------+---------+------+
10 rows in set (0.01 sec)

ただし、このクエリは問題なく実行されますが、ご覧のとおり、このテーブルには何百ものデータがあります。私が必要なのは:

SELECT post_id, 
       count(post_id) 
FROM   'table'
WHERE  type = '1' 
GROUP  BY post_id 
ORDER  BY count(post_id) 
LIMIT  300; 

このクエリは、最も高く評価された 300 件の投稿を選択し、php コードはその中からランダムに 1 つを選択します。ただし、このクエリには全テーブル スキャンがあり、5 秒以上処理されます。どうすればこれを高速化できますか、またはテーブルスキームを変更する必要がありますか?

4

1 に答える 1

0

インデックスを使用すると、ある程度のスピードアップが得られる場合があります。クエリは計算コストが高いため、キャッシュの方が適切な場合があります。これらのインデックスのいずれかまたは両方があると、テーブルに役立つかどうかを確認してください。

CREATE INDEX post_id_index ON `table` (post_id);
CREATE INDEX type_index ON `table` (type);

そうでない場合は、次のコマンドで削除します。

DROP INDEX post_id_index ON `table`;
DROP INDEX type_index ON `table`;

役に立たない場合は必ずドロップしてください。ただし、念のため、事前に数回試してください。キャッシングが適切でない場合の別のオプションは、その結果だけの別のテーブルを保持することです。それはすでに提案されているのではないかと思います。インデックスを作成するのは非常に簡単なので、インデックスをお勧めします。それぞれを完全なSQLコマンドとして実行し、問題のクエリが高速かどうかを確認してください。インデックスに関する詳細情報は次のとおりです。

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

于 2013-01-10T21:36:25.217 に答える