MySQL での制限の使用法: クエリ ステートメントを使用するとき、データの最初の数行または中間行を返す必要があることがよくあります。このときどうすればよいでしょうか。心配しないでください。mysql はすでにそのような機能を提供しています。
SELECT * FROM テーブル LIMIT [オフセット,] 行 OFFSET オフセット |
LIMIT 句を使用すると、SELECT ステートメントで指定した数のレコードを強制的に返すことができます。 LIMIT は 1 つまたは 2 つの数値引数を受け入れます。パラメータは整数定数である必要があります。 2 つのパラメーターが指定された場合、最初のパラメーターは最初に返されるレコード行のオフセットを指定し、2 番目のパラメーターは返されるレコード行の最大数を指定します。最初のレコード行のオフセットは (1 ではなく) 0 です。PostgreSQL との互換性のために、MySQL は構文 LIMIT # OFFSET # もサポートしています。
mysql> SELECT * FROM table LIMIT 5,10 // レコード行 6 ~ 15 を取得します。
//特定のオフセットからレコードセットの末尾までのすべてのレコード行を取得するには、2 番目のパラメーターとして -1 を指定します。
mysql> SELECT * FROM table LIMIT 95,-1; // レコード行 96 から最後を取得します。
//パラメータが 1 つだけ指定された場合は、レコード行の最大数を返すことを意味します。
mysql> SELECT * FROM table LIMIT 5 //最初の 5 レコード行を取得します。
//言い換えると、LIMIT n は LIMIT 0,n と同等です。
制限 10 と制限 9,1 の違いに注意してください。
例えば:
1.
選択 * サイクロペディアより ID>=(
(から最大(ID)を選択してください)
サイクロペディアから ID を選択 ID 制限で注文 90001
) 一時として
) 制限 100;
2.
選択 * サイクロペディアより ID>=(
(から最大(ID)を選択してください)
サイクロペディアから ID を選択 ID 制限で注文 90000,1
) 一時として
) 制限 100;
同様に、90,000 件の後に次の 100 件のレコードを取得した場合、最初の文と 2 番目の文のどちらが速いでしょうか?
最初の文は、最初に最初の 90001 レコードを取得し、最大の ID 値を開始識別子として取得し、それを使用して次の 100 レコードを迅速に検索します。2 番目の文は、最後の 90000 レコードのみを取得し、その後、 ID 値。開始マークを使用して 100 レコードの最初の文を検索し、100 行をセット (0.23) 秒で実行します。
文 2.100 行、セット (0.19) 秒の実行結果
実際、2 番目の文は次のように簡略化できます。
選択 * サイクロペディアより ID>=(
百科事典の制限から ID を選択 90000,1
) 100 を制限します。
Max 操作を経由せずに 90,000 番目のレコードの ID を直接使用すると、理論的にはより効率的になるはずですが、位置決め ID は 1 つのレコードのみを返し、Max はほとんどその必要がないため、実際の使用では効果はほとんどわかりません。実行すると結果が得られますが、この方法で書くとより明確になり、ヘビを描く必要がなくなります。
トップ 100 を選択 * 百科事典より ID>=(
() から上位 90001 最大 (ID) を選択してください
サイクロペディアから ID を選択 ID で並べ替え
) 一時として
)
ただし、ストアド プロシージャで実装されるかコードで直接実装されるかに関係なく、MS-SQL の TOP が常に最初の N レコードを返すことがボトルネックになります。この状況は、データ量が大きくない場合にはあまり感じられません。それに比べて、MySQL の制限には多くの利点があります。
、埋め込む:
百科事典から ID を選択 制限 90000
百科事典の制限から ID を選択 90000,1
結果は次のとおりです。
セットで 90000 行 (0.36) 秒
セット内の 1 行 (0.06) 秒
MS-SQL では、Select Top 90000 ID From cyclopedia のみを使用できます。実行時間は 390 ミリ秒であり、同じ操作の実行時間は MySQL の 360 ミリ秒ほどではありません。
レコード数が多い場合は、limit のオフセットが使用されます。レコード数が少ない場合は、オフセットが小さくなるため、limit を直接使用することをお勧めします。オフセットが大きいほど、後者の方が優れています。
//////////////////////////////////////////////// /// ////////////////////////
1. オフセットが比較的小さい場合。
select * from yanxue8_訪問制限 10,10
複数回実行しても、時間は 0.0004 ~ 0.0005 の間のままです。
yanxue8_visit から * を選択してください。どこで vid >=(
yanxue8_visit から vid を選択してください vid 制限 10,1 で注文します
) リミット10
複数回実行すると、時間は 0.0005 ~ 0.0006 の間で推移し、主に 0.0006 になります。
結論: オフセット offset が小さい場合は、limit を直接使用する方が良いです。この表示はサブクエリによるものです。
2. オフセットが大きい場合。
select * from yanxue8_訪問制限 10000,10
複数回実行しても、時間は約 0.0187 のままです。
yanxue8_visit から * を選択してください。どこで vid >=(
yanxue8_visit から vid を選択 vid 制限 10000,1 で注文
) リミット10
複数回実行しても、時間は約 0.0061 にとどまり、前の 1/3 にすぎません。プリセットのオフセットが大きいほど、後者の方が優れています。
//////////////////////////////////////////////// /// ////////////////////////////////////////////// /
mysql> SELECT * FROM table LIMIT 95,-1; // レコード行 96 から最後を取得します。
//パラメータが 1 つだけ指定された場合は、レコード行の最大数を返すことを意味します
この記事は CSDN ブログからのものです。転載する場合は出典を明記してください: http://blog.csdn.net/zhqingyun163/archive/2009/12/22/5053579.aspx