この 2 つのクエリについては本当に混乱しています。クエリ速度が不安定です。これが私の 2 つのテーブル スキームです。
投稿テーブル: (id、タイトル、日付など...) [日付インデックス]
関係テーブル: (news_id, relationship_id) [両方と行ごとにインデックスがあります]
クエリ A:
SELECT *
FROM posts
WHERE id IN (
SELECT news_id
FROM relationships
WHERE relation_id IN (?)
)
AND status = 1
ORDER BY `date` DESC
クエリ B:
SELECT *
FROM posts AS p
INNER JOIN relationships AS r ON r.news_id = n.id
WHERE r.relation_id IN (?)
AND n.status = 1
ORDER BY n.date DESC
奇妙な部分はテスト結果です。最初に 30 行の relationship_id を試します。
クエリ A: 合計 30 件、クエリにかかった時間は 5.56 秒
クエリ B: 合計 30、クエリにかかった時間は 0.03 秒
A は行数が少ないほど遅く、B は行数が少ないほど高速です。次に、3k 行の relationship_id を試します。
クエリ A: 合計 3,850、クエリにかかった時間は 0.05 秒
クエリ B: 合計 3,850、クエリにかかった時間は 0.70 秒
したがって、これは私を混乱させます。より多くのデータで、A はより高速になりました。最後に、+10k 行で複数の relationship_id を試します。例;relation_id IN (1, 2, 3, 4)
クエリ A: 合計 18,906、クエリにかかった時間は 0.01 秒
クエリ B: 合計 18,906、クエリにかかった時間は 3.34 秒
それで、私は何をすべきですか?クエリ A は非常に多くの行で高速ですが、行が少ないと遅くなります。このクエリの別の真の方法の提案はありますか? (下手な英語や文法の間違いでごめんなさい)
編集
これが SQL EXPLAIN です。
30 行のクエリ A
30 行のクエリ B
18,000 行のクエリ A
18,000 行のクエリ B