2017-12-08 13 views
2

制限構文を使用するためにクエリのパフォーマンスがどのように影響を受けるかを知りたい 180000行があります。ですから、私は限界構文を使ってデータを選択します。 は、だから私は限界の構文とクエリのパフォーマンスとの関係を知りたい よろしくQuery performaceを使用したMySQLの制限構文

+0

私が知らない最近の改良点がない場合、これらの2つの間には関係がありません。 – GhostGambler

+2

LIMITはクエリの実行を遅くすることがあります。20000000レコードを取得する必要があるため、LIMIT 10000000,10000000などの大きなオフセットを使用する場合。また、MySQLはクエリを実行するために一時テーブルを使用する必要があります。 –

+1

@RaymondNijland LIMITを使用しないと、すべてのデータが受信されます。すべてのデータは、通信チャネルを介して送信しなければなりません。クエリで使用できるposition-columnを持つ場合と比較して遅くなりますが、これはすべての場合で可能ではありません。 – GhostGambler

答えて

3

LIMIT通常、要求元のクライアントにMySQLサーバから大きな結果セットを送信するコストの一部が保存されます。クライアント側で不必要な行を単にスキップするのではなく、結果セットの行がほんの少し必要な場合は、LIMITを使用するとよいでしょう。

LIMITを使用すると、反反響パターンが有名ですが、です。このようなクエリは、MySQLのサーバーリソース(時間とRAM)でこのような

SELECT a,whole,mess,of,columns,... 
    FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something .... 
    ORDER BY whole, mess DESC 
    LIMIT 5 

です。どうして?大きな結果セットを生成してからソートし、いくつかの行を除くすべてを破棄します。

もう1つパフォーマンス反パターンは、複合結果セットに適用されます。LIMIT small_number, big_numberです。少数の行を得るためには、多くの行を突き抜けなければなりません。

あなたは延期パターン、このようなものに参加してこれらを回避することができます。

SELECT a,whole,mess,of,columns,.. 
    FROM (
     SELECT big_table_id 
      FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something .... 
     ORDER BY whole, mess DESC 
     LIMIT 5, 200000 
     ) ids, 
    JOIN big_table ON ids.big_table_id = big_table.big_table_id 
    JOIN big_tableb ON something JOIN big_tablec ON something ... 

このパターンの注文をしてからちょうどいくつかのid値ではなく、列の全体の混乱を捨てます。

LIMITを使用すると、実際にを使用すると、結果セットがインデックスで注文される状況では、パフォーマンスが向上します()。たとえば、あなたがdatestampのインデックスを持っていて、MySQLの問い合わせプランナが

SELECT datestamp, col, col 
    FROM table 
    ORDER BY datestamp DESC 
    LIMIT 20 

datestampインデックスを逆方向にスキャンし、ちょうど20行を取得することができない場合。

+0

(これは 'LIMIT offset、limit'ですので、あなたのコメントの一部は後方にあります) –

1

素早く任意のSQLコマンドの影響を測るための最も簡単な方法は、EXPLAINを使用して、クエリをINGのことは通常は良いルートであるEXPLAINを皮切り...などの行数をチェックしています。照会の前に「EXPLAIN」を入れて、どれだけ高価であるか調べてください。

は問題ではないかもしれません、大規模なデータセットを送信する - それはの私の経験でソート

を、それは非常に遅いORDER BYの使い方です。頻繁にLIMITORDER BYが明白な理由で一緒に使用されています。それはLIMITではなく、遅い部分であるソートです。

LIMITは、破棄される可能性のある大きなデータセットを返さないようにしますが、通常は実際には同じローカルネットワーク上にあるか、同じサーバーにさえなります。ネットワークパフォーマンス&大きなデータセットは通常、制限要因ではありません。代わりに、それを返す前にデータをソートするコストが最も高くなります。これらのソートを最適化することで、たとえばクエリに一致するインデックスを作成するなど、最大の利点を得ることができます。

+0

' EXPLAIN'は通常 'LIMIT'を無視します。それで、ここで助けてください。 –

関連する問題