を持っているクエリを詳しく見てみましょうORDER BY id DESC LIMIT 300000, 15
。
MySQLサーバーはそれを実行するために何をしなければなりませんか?まず、プライマリインデックスに従ってすべてのレコードid
を降順でフェッチする必要があります。これは30万回発生する必要があることに注意してください。300,000カウントに達すると、サーバーは結果行の出力を開始でき、そのうち15行のみになります。300kの初期オフセットではなく、もっと小さいものを使用した場合、このクエリははるかに高速に機能します。
query1がquery2と10倍異なるのはなぜですか?これはTEXT
、MySQLの列が(そこに格納されていない)親テーブルにリンクされており、それらを取得するには追加のルックアップが必要であるが、VARCHAR
テーブルに格納されているためです。あなたの場合、行300,000に到達するまでTEXT
実際に列をプルする必要がないため、列が優先されます(サーバーは、別の非表示のテーブルの列への比較的小さな参照のみをプルします)。ただし、列の場合、サーバーは100バイトの範囲であっても、列全体をプルする以外に選択肢がありません。これが、10倍遅い理由です。body
body
TEXT
title
title
正確に言うのは難しいです。これは、最初のクエリの実行速度が遅いが、すべてのテーブルデータをRAMにキャッシュしたため、2番目のクエリの実行速度が大幅に向上したことが原因である可能性があります。結論を出す前に、すべてのクエリを少なくとも3回繰り返す必要があります。
LIMIT 300000, 15
あなたへの私の提案は、に置き換える方法を見つけることです
WHERE id BETWEEN 300000 AND 300014
または可能であれば同等のもの。この場合、サーバーはプライマリインデックスを利用できるようになり、非常に高速になります。