0

400,000 を超えるレコードを含むMyIsamテーブルから、定義されたユーザーのリストによって送信された最後の 20 件の投稿を選択する必要があるクエリに取り組んでいます。唯一の問題は、クエリが約0.6秒で実行され、場合によっては 2 秒以上かかることです。

SELECT post_id
FROM posts
WHERE post_author IN (32, 85, 222, 81, 250,  [..cut..] , 5908, 4930, 6658, 6757, 6398, 6324, 6629)
ORDER BY post_id DESC
LIMIT 20

ORDER BYクエリを削除すると、はるかに高速になり、"post_author" 列で正しいインデックスが使用され、代わりに完全なテーブル スキャンが実行されます...このようなクエリを作成する最良の方法は何ですか?


author_index を使用したテスト #1

  • プライマリ(post_id)
  • author_index (post_author)

時間: 0.7 秒 多くの著者とともに説明する

SELECT post_id
FROM posts
WHERE post_author IN (32, 85, 222, 81, 250,  [..cut..] , 5908, 4930, 6658, 6757, 6398, 6324, 6629)
ORDER BY post_id DESC
LIMIT 20

時間: 0.004 秒 少数の著者で説明する

SELECT post_id
FROM posts
WHERE post_author IN (58,68)
ORDER BY post_id DESC
LIMIT 20

複合インデックスを使用したテスト #2

  • プライマリ(post_id)
  • view_posts_index (post_id, post_author)

時間: 0.05 秒 多くの著者とともに説明する

SELECT post_id
FROM posts
WHERE post_author IN (32, 85, 222, 81, 250,  [..cut..] , 5908, 4930, 6658, 6757, 6398, 6324, 6629)
ORDER BY post_id DESC
LIMIT 20

時間: 1.5 秒 少数の著者で説明する

SELECT post_id
FROM posts
WHERE post_author IN (58,68)
ORDER BY post_id DESC
LIMIT 20

複合インデックスと author_index を使用したテスト #3

  • プライマリ(post_id)
  • view_posts_index (post_id, post_author)
  • author_index (post_author)

時間: 0.7 秒 多くの著者とともに説明する

SELECT post_id
FROM posts
WHERE post_author IN (32, 85, 222, 81, 250,  [..cut..] , 5908, 4930, 6658, 6757, 6398, 6324, 6629)
ORDER BY post_id DESC
LIMIT 20

時間: 0.0037 秒 少数の著者で説明する

SELECT post_id
FROM posts
WHERE post_author IN (58,68)
ORDER BY post_id DESC
LIMIT 20

ご協力いただきありがとうございます。

4

3 に答える 3

1

post_author 列と post_id 列の両方にインデックスを作成します。

CREATE INDEX ix_post_search ON posts(post_author, post_id);

これにより、MySQL はこのインデックスのみを見ることでクエリ全体を満たすことができます。

于 2012-08-28T20:13:04.477 に答える
0

クエリでインデックスが使用されていることを確認してくださいpost_id(おそらくpost_author、質問の一部ではありません)。そうしないと、必要な量の行が生成されるとすぐに全範囲スキャンが開始および停止されます。

于 2012-08-28T19:36:51.560 に答える
0

私はそれを試してみると思います。列の作成者に1つのインデックスがあり、当然、一意のIDにもインデックスがあることを確認します:)

SELECT p2.post_id FROM posts p2
WHERE p2.post_id IN (
  SELECT p1.post_id
  FROM posts p1
  WHERE p1.post_author IN (32, 85, 222, 81, 250,  [..cut..] , 5908, 4930, 6658, 6757, 6398, 6324, 6629)
 )
ORDER BY p2.post_id
LIMIT 20

それがあなたの問題を解決するかどうか教えてください

于 2012-08-28T19:45:20.260 に答える