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
ご協力いただきありがとうございます。