ホームページ >バックエンド開発 >PHPチュートリアル >selllimit Limitパラメータを使用してMySQLクエリを最適化する方法

selllimit Limitパラメータを使用してMySQLクエリを最適化する方法

WBOY
WBOYオリジナル
2016-07-29 08:39:081350ブラウズ

数日前、外国人が書いたプログラムを読みました。そのプログラムでは、MySQL クエリで Limit キーワードが多用されていました。私の印象では、Limit キーワードは MySQL を使用するプログラムでよく使用されているように思えたので、非常に興味を持ちました。演算子はクエリ ページングを実行するために使用されます (もちろん、これも優れたクエリ最適化です)。Oracle では通常、
SELECT * FROM という SQL 文を使用する必要があるとします。
( SELECT a1.*, rownum rownum_
FROM testtable a1
WHERE rownum > 20)
WHERE rownum_ このステートメントは testtable テーブル内の 20 ~ 1000 のレコードをクエリでき、ネストされたクエリも必要です。効率はあまり高くありません。MySQL の実装を見てください:
SELECT * FROM testtable a1 limit 20,980;
このようにして、testtable テーブル内の 21 ~ (20 + 980 =) 1000 のレコードを返すことができます。
実装構文は確かに単純ですが、ここで 2 つの SQL ステートメントの効率について話したい場合、MySQL の Limit オプションには多くの異なる解釈方法があり、異なる方法による速度の違いがあるため、比較するのは困難です。非常に大きいため、このステートメントの単純さから誰がより効率的であるかを判断することはできません。
でも、プログラマーにとっては、メンテナンスコストが低いので、シンプルなものが良いのです(笑)。
この Limit の構文について説明します:
SELECT ……. --Select ステートメントのその他のパラメーター
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
ここでの offset はオフセットです (このオフセットは開始アドレスです)は 1 ではなく 0 であるため、間違いやすいです) 名前が示すように、開始点から離れた位置であり、row-count も非常に単純で、返されるレコード数の制限です。例: SELECT * FROM testtable a limit 10,20 where …
これにより、結果は 10 行後に where 条件を満たす 20 個のレコードを返すことができます (10 行自体を含む)。
その後、制約がなければ、10行から29行のレコードが返されます。
それでは、これはテーブル全体のスキャンを回避することとどのような関係があるのでしょうか? 以下は、MySQL マニュアルの Limit パラメーター最適化スキャンに関する説明です。
場合によっては、HAVING を使用する代わりに LIMIT オプションを使用すると、MySQL はクエリを異なる方法で処理します。
l LIMIT を使用して行のサブセットのみを選択する場合、MySQL は通常、完全なテーブル スキャンを実行しますが、場合によってはインデックス (ipart に関連する) を使用します。
l LIMIT n と ORDER BY を同時に使用すると、MySQL が条件を満たす最初のレコードを見つけた後、テーブル全体をソートするのではなく、ソートが終了します。
l LIMIT n と DISTINCT を一緒に使用すると、MySQL はレコードを見つけた後にクエリを停止します。
l 場合によっては、GROUP BY は、キーを順番に読み取り (またはキーで並べ替え)、キーの値が変わるまで要約を計算することで解決できます。この場合、LIMIT n は不要な GROUP を評価しません。
l MySQL は、n 番目の行をクライアントに送信し終わると、残りのクエリを破棄します。
l そして、LIMIT 0 オプションは常にすぐに空のレコードを返します。これは、クエリをチェックし、結果列の列タイプを取得するのに役立ちます。
l 一時テーブルのサイズは、LIMIT # を使用して、クエリを解決するために必要なスペースの量を計算します。

上記では、selllimit が Limit パラメータを使用して MySQL クエリを最適化する方法を紹介しました。selllimit の内容も含めて、PHP チュートリアルに興味のある友人の役に立てば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。