負荷をかけた状態でデータベース設計をテストしており、一定数の行 (5000) のみを取得する必要があります
これを達成するために LIMIT を指定できますが、クエリは一致するすべての行の結果セットを構築し、制限で指定された行数のみを返すようです。それが実装されている方法ですか?
MySQL が 1 つの行を読み取り、別の行を読み取り、5000 番目の一致する行を取得したときに基本的に停止することはありますか?
MySQLはLIMIT 5000
、クエリでaを指定した場合、最初に結果セット全体を生成せずにその結果を生成できるという点で賢く、結果全体を構築しません。
たとえば、次のクエリ:
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 からカウント) までのレコードが表示されます。
このようなクエリの複雑さは O(LIMIT) です (order by を指定しない限り)。
これは、10000000 行がクエリに一致し、5000 に等しい制限を指定した場合、複雑さは O(5000) になることを意味します。
@Jarosław Gomułka は正しい
です。ORDER BY で LIMIT を使用すると、MySQL は、結果全体をソートするのではなく、ソートされた結果の最初の row_count 行が見つかるとすぐにソートを終了します。インデックスを使用して順序付けを行う場合、これは非常に高速です。どちらの場合でも、最初の行が見つかった後は、結果セットの残りを並べ替える必要はなく、MySQL はそうしません。セットがソートされていない場合、結果セットに十分な行が得られるとすぐに SELECT 操作を終了します。
クエリ オプティマイザーが使用する正確なプランは、クエリ (選択されているフィールド、LIMIT 量、および ORDER BY があるかどうか) とテーブル (キー、インデックス、およびテーブル内の行数) によって異なります。インデックスのない列を選択したり、非キー列で並べ替えたりすると、列を選択して主キー列で並べ替える場合とは異なる実行計画が生成されます。後者はテーブルに触れず、LIMIT で指定された行数のみを処理します。