0

無駄な文章が多くてすみません。最も重要なことは、最後の 3 つの段落で説明されています:D

最近、クライアント サーバーの 1 つで mysql の問題が発生しました。何かが突然、mysql プロセスの CPU を急上昇させ始めます。この問題により、不適切なクエリを見つけて最適化することになり、ここに問題があります。

最適化によりクエリが高速化されていると考えていました(クエリの実行に必要な合計時間)。しかし、それに向けていくつかのクエリを最適化した後、私の同僚の最初の同僚は、一部のクエリがテーブルからすべての行を読み取る行が多すぎると不平を言い始めました(EXPLAINで示されているように)。

クエリを書き直した後、クエリで読み取る行を少なくしたい場合、クエリの速度が低下し、速度を重視してクエリを作成すると、より多くの行が読み取られることに気付きました。

そして、それは私には意味がありませんでした:読み取られる行は少なくなりますが、実行時間は長くなります

そして、それは私が何をすべきか疑問に思いました。もちろん、最小限の行を読み取る高速なクエリがあれば完璧です。しかし、私にはそれができないように思われるので、いくつかの答えを探しています。どちらのアプローチを取るべきですか - 速度または読み取り行数が少ないですか? クエリが高速であるが、より多くの行が読み取られ、速度が低下して読み取られる行が少ない場合の長所と短所は何ですか? さまざまなケースでサーバーはどうなりますか?

グーグルで検索した後、速度を向上させる方法に関する記事とディスカッションしか見つかりませんでしたが、前述のさまざまなケースはカバーされていませんでした.

もちろん、何らかの理由で個人的な選択が見られることを楽しみにしています。私を正しい方向に導くことができるリンクも大歓迎です。

4

3 に答える 3

2

あなたの問題は、読み取る行の量をどのように制限しているかに依存すると思います。MySQL が実行する必要がある WHERE 句をより多く実装して読み取る行を減らすと、パフォーマンスが低下します。

おそらく、検索をより複雑にするいくつかの列にインデックスを付けることを検討します。単純なデータ型は、複雑なものよりもルックアップが高速です。インデックス付きの列を検索しているかどうかを確認してください。

于 2013-05-09T18:23:40.187 に答える
2

これ以上のデータがなくても、いくつかのヒントを提供できます。

  1. テーブルが適切にインデックス化されていることを確認してください。各テーブルに適切なインデックスを作成します。不要なインデックスも削除します。
  2. クエリごとに最適なアプローチを決定します。たとえば、group by行の重複除外のみを使用する場合は、リソースを浪費しています。select distinct(インデックス付きフィールドで)使用することをお勧めします。
  3. 「分割統治」 . プロセスを 2 つ、3 つ、またはそれ以上の中間ステップに分割できますか? 答えが「はい」の場合: これらの手順の一部で一時テーブルを作成できますか? 私は一時テーブルを使用してプロセスを分割しましたが、それらは作業を高速化するのに非常に役立ちます。
于 2013-05-09T18:24:18.183 に答える
2

とにかく、 EXPLAIN によって報告される読み取り行数は推定値です。これをリテラル値と見なさないでください。EXPLAIN を同じクエリで複数回実行すると、読み取られる行数が毎回変わることに注意してください。EXPLAIN には時々バグが存在するため、この見積もりは完全に不正確である可能性さえあります。

クエリのパフォーマンスを測定するもう 1 つの方法はSHOW SESSION STATUS LIKE 'Handler%'、クエリをテストすることです。これにより、SQL レイヤーが個々の行をストレージ エンジン レイヤーに要求した回数の正確なカウントがわかります。例については、私のプレゼンテーション、SQL Query Patterns, Optimizedを参照してください。

要求された行が既にバッファー プールにあったかどうか (InnoDB を使用していると想定しています)、またはクエリでディスクから読み取る必要があり、I/O 操作が発生したかどうかという問題もあります。ディスクから読み取られる少数の行は、RAM から読み取られる多数の行よりも桁違いに遅くなる可能性があります。これは必ずしもあなたのケースを説明しているわけではありませんが、そのようなシナリオが発生する可能性があることを指摘しており、「行の読み取り」は、クエリが I/O を引き起こしたかどうかを示していません。InnoDB のマルチバージョニングにより、1 つの行に対して複数のI/O 操作が発生することさえあります。

論理行要求と物理 I/O 読み取りの違いを理解するのは困難です。Percona Server では、スロー クエリ ログの機能強化に、クエリごとの InnoDB I/O 操作のカウントが含まれます。

于 2013-05-09T18:25:23.740 に答える