2

したがって、このクエリは約0.5秒と比較的高速ですが、ORDER BY句を追加すると、30秒近くまでジャンプします。

元のクエリ:(約0.5秒で返されます)

SELECT table1.*,table2.* FROM table1 LEFT OUTER JOIN table2 ON table1.column2=table2.column3 WHERE table1.column1='value' LIMIT 4

ORDER BYを使用したクエリ:(約30秒で戻ります)

SELECT table1.*,table2.* FROM table1 LEFT OUTER JOIN table2 ON table1.column2=table2.column3 WHERE table1.column1='value' ORDER BY table1.column4 DESC LIMIT 4

注ORDERBYによって使用されている列にインデックスを追加しましたが、何も変更されていません。

何がこれを引き起こしているのかについてのアイデアはありますか?

4

6 に答える 6

10

クエリは最初に見つかった 4 つのアイテムを選択することができないため、これには時間がかかります。リスト全体を並べ替えてから、上位 4 つを選択する必要があります。

これを修正するには、table1{column4, ...} を含むインデックスを追加します。テーブル 1 から少数の列のみが必要な場合 (そしてそれらが狭い場合)、それらすべてをインデックスに追加します ( indexをカバーします)。

適切にインデックスが作成されていれば、SQL エンジンは必要な最初の 4 つの列だけを取得できます。セット全体ではありません。

インデックスがあり、それが役に立たない場合は、クエリをEXPLAINで実行して、実行計画がどのように見えるかを確認してください (良いヒント、@IronGoofy):

EXPLAIN 
  SELECT table1.*,table2.* 
  FROM table1 
  LEFT OUTER JOIN table2 ON table1.column2=table2.column3 
  WHERE table1.column1='value' ORDER BY table1.column4 DESC LIMIT 4
于 2009-01-15T15:12:02.740 に答える
2

マイケルの説明、+1 に同意します。

違いを生まないインデックスについては、実行計画を見てください(MySQLでそれを行う方法がわからない-誰かがこれを編集できるでしょうか?)。繰り返しますが、これにより処理が高速化されるというマイケルの意見に同意します (column4 が「選択的」である限り)。

@kogus:結果セット全体をクライアントに取得することは、結果セットを注文することと同じではありません。注文は、すべての結果をネットワーク経由で転送する必要なく、サーバー上で行う必要があります

于 2009-01-15T15:26:22.913 に答える
1

table1.column1 は索引付けされていますか? はいの場合、クエリ オプティマイザはそのインデックスを使用して table1 から最初の行セットを選択します。

このクエリが頻繁に実行されるクエリである場合は、(column1,column4) にインデックスを付けることで、必要なパフォーマンスを得ることができます。MySQL についてはよくわかりませんが、Oracle を使用すると、インデックス (column1,column4,column2) を作成することでパフォーマンスをさらに向上させることができます。これにより、オプティマイザーはインデックスからすべての作業を実行し、テーブル データにまったく触れなくなります。

ただし、インデックスの追加にはトレードオフがあります。すべての挿入 (またはインデックス付き列の更新) にかかる時間が長くなり、データベースが大きくなり、不足するメモリ リソース (つまり、バッファ キャッシュ) が割り当てられるため、全体的な速度が低下する可能性があります。新しいインデックス。

于 2009-01-15T15:22:51.720 に答える
0

どのようにクエリを実行していますか?

一部のツールでは、最初の 100 程度のレコードのみを取得し、必要に応じてさらにプルダウンするのが一般的です。

ORDER BY を追加すると、ツールは強制的に ENTIRE データセットを取得します。

MySql ブラウザーを使用している場合は、ORDER BY なしで実行してから、CTRL-END を使用してデータグリッドの一番下までスクロールしてみてください。それにはどれくらい時間がかかりますか?

于 2009-01-15T15:13:08.807 に答える
0

Explainを実行してみてください:

EXPLAIN SELECT table1.*,table2.* FROM table1 LEFT OUTER JOIN table2 ON table1.column2=table2.column3 WHERE table1.column1='value' ORDER BY table1.column4 DESC LIMIT 4

これはおそらく、MySQL がファイルソートを行っていることを示しています。(column1, column4) にインデックスを付けることはできますか?

あなたのモデルについてもっと教えていただけますか?どのインデックスを使用していますか? 説明の出力を表示できますか? フィールドにはどのような型が使用されていますか?

于 2009-01-15T15:33:05.100 に答える
0

Michaelが言及したインデックスの内容に同意しました。

さらに、MySQL では、クエリの前に EXPLAIN を追加した結果を調べることで、クエリのパフォーマンスについて多くのことを知ることができます。

EXPLAIN SELECT * FROM foo_tbl WHERE foobar = 'foo'

クエリをより適切に設計し、適切にインデックスを作成するのに役立ちます。EXPLAIN 構文とEXPLAIN を使用したクエリの最適化について読んでください。

于 2009-01-15T15:34:13.677 に答える