負荷の下でデータベース設計をテストしており、一定数の行(5000)のみを取得する必要があります
これを実現するためにLIMITを指定できますが、クエリは一致するすべての行の結果セットを作成し、制限で指定された行数のみを返すようです。それはどのように実装されていますか?
MySQLが1つの行を読み取り、別の行を読み取り、5000番目に一致する行を取得したときに基本的に停止するものはありますか?
MySQLは、クエリでLIMIT 5000
を指定し、最初に結果セット全体を生成せずにその結果を生成できる場合、結果全体を構築しないという点で優れています。
たとえば、次のクエリ:
SELECT * FROM table ORDER BY column LIMIT 5000
このクエリは、table
にインデックスがない限り、column
全体をスキャンする必要があります。その場合、スマートなことを行い、インデックスを使用して最小のcolumn
。
SELECT * FROM `your_table` LIMIT 0, 5000
これにより、データベースから最初の5000件の結果が表示されます。
SELECT * FROM `your_table` LIMIT 1001, 5000
これにより、1001〜6000(0からカウント)のレコードが表示されます。
@JarosławGomułkaが正しい
LIMITをORDER BYとともに使用すると、MySQLは結果全体をソートするのではなく、ソートされた結果の最初のrow_count行を見つけるとすぐにソートを終了します。インデックスを使用して順序付けを行う場合、これは非常に高速です。どちらの場合でも、最初の行が見つかった後、結果セットの残りをソートする必要はありません。MySQLはソートしません。セットがソートされていない場合、結果セットに十分な行があるとすぐにSELECT操作を終了します。
そのようなクエリの複雑さはO(LIMIT)(order byを指定しない限り)です。
つまり、10000000行がクエリと一致し、5000に等しい制限を指定すると、複雑度はO(5000)になります。
クエリオプティマイザーが使用する正確なプランは、クエリ(選択されているフィールド、LIMIT量、ORDER BYの有無)およびテーブル(キー、インデックス、テーブル内の行数)によって異なります。インデックスなしの列を選択したり、非キー列で並べ替えたりすると、列を選択して主キー列で並べ替える場合とは異なる実行計画が作成されます。後者はテーブルに触れず、LIMITで指定された行数だけを処理します。
この記事 で説明したように、各データベースは、使用しているデータベースに応じて結果セットのサイズを制限する独自の方法を定義します。
SQL:2008仕様では、SQLクエリを制限するための標準構文が定義されていますが、MySQL 8ではサポートされていません。
したがって、MySQLでは、LIMIT句を使用して、結果セットをTop-Nレコードに制限する必要があります。
SELECT
title
FROM
post
ORDER BY
id DESC
LIMIT 50
ORDER BY句を使用していることに注意してください。それ以外の場合、返される結果セットに含まれる最初のレコードである保証はありません。