web-dev-qa-db-ja.com

MySQLで固定数の行のみを取得する

負荷の下でデータベース設計をテストしており、一定数の行(5000)のみを取得する必要があります

これを実現するためにLIMITを指定できますが、クエリは一致するすべての行の結果セットを作成し、制限で指定された行数のみを返すようです。それはどのように実装されていますか?

MySQLが1つの行を読み取り、別の行を読み取り、5000番目に一致する行を取得したときに基本的に停止するものはありますか?

17
Sandman

MySQLは、クエリでLIMIT 5000を指定し、最初に結果セット全体を生成せずにその結果を生成できる場合、結果全体を構築しないという点で優れています。

たとえば、次のクエリ:

SELECT * FROM table ORDER BY column LIMIT 5000

このクエリは、tableにインデックスがない限り、column全体をスキャンする必要があります。その場合、スマートなことを行い、インデックスを使用して最小のcolumn

25
Keith Randall
 SELECT * FROM `your_table` LIMIT 0, 5000 

これにより、データベースから最初の5000件の結果が表示されます。

 SELECT * FROM `your_table` LIMIT 1001, 5000 

これにより、1001〜6000(0からカウント)のレコードが表示されます。

7
Teja

@JarosławGomułkaが正しい
LIMITをORDER BYとともに使用すると、MySQLは結果全体をソートするのではなく、ソートされた結果の最初のrow_count行を見つけるとすぐにソートを終了します。インデックスを使用して順序付けを行う場合、これは非常に高速です。どちらの場合でも、最初の行が見つかった後、結果セットの残りをソートする必要はありません。MySQLはソートしません。セットがソートされていない場合、結果セットに十分な行があるとすぐにSELECT操作を終了します。

3
aquasan

そのようなクエリの複雑さはO(LIMIT)(order byを指定しない限り)です。

つまり、10000000行がクエリと一致し、5000に等しい制限を指定すると、複雑度はO(5000)になります。

2

クエリオプティマイザーが使用する正確なプランは、クエリ(選択されているフィールド、LIMIT量、ORDER BYの有無)およびテーブル(キー、インデックス、テーブル内の行数)によって異なります。インデックスなしの列を選択したり、非キー列で並べ替えたりすると、列を選択して主キー列で並べ替える場合とは異なる実行計画が作成されます。後者はテーブルに触れず、LIMITで指定された行数だけを処理します。

0
mdoyle

この記事 で説明したように、各データベースは、使用しているデータベースに応じて結果セットのサイズを制限する独自の方法を定義します。

SQL:2008仕様では、SQLクエリを制限するための標準構文が定義されていますが、MySQL 8ではサポートされていません。

したがって、MySQLでは、LIMIT句を使用して、結果セットをTop-Nレコードに制限する必要があります。

SELECT
    title
FROM
    post
ORDER BY
    id DESC
LIMIT 50

ORDER BY句を使用していることに注意してください。それ以外の場合、返される結果セットに含まれる最初のレコードである保証はありません。

0
Vlad Mihalcea