2

heidiSQL エディターを使用して mySQL クエリを実行しています。クエリ時間が表示されるときに、ネットワーク時間も含まれることがあります。

1 回のクエリの所要時間: 1.194 秒。(+ 10.078 秒ネットワーク)

しかし、すべてが自分のコンピューター上にあるため、実際にはネットワークになることはできませんか?? その余分な時間は、別のセットアップで消えるものですか、それとも通常の方法でクエリのパフォーマンスを改善する必要がありますか (書き直し/やり直し)? 何が原因でパフォーマンスが低下しているのかさえわからない場合、クエリのパフォーマンスを改善することは困難です。

編集: プロファイリング情報

私はこのきちんとしたプロファイリング sql を使用しました: http://www.mysqlperformanceblog.com/2012/02/20/how-to-convert-show-profiles-into-a-real-profile/

クエリ 1:

my_table_with_100_thousand_rows から count(*) を選択します。

"1 回のクエリの所要時間: 0.390 秒" (これにはネットワーク時間は表示されませんでしたが、単純なカウントで約 0.4 秒 (*) はかなり長いようです。)

STATE                    Total_R    Pct_R   Calls    R/Call
Sending data            0.392060    35.84   1    0.3920600000
freeing items           0.000214    0.02    1    0.0002140000
starting                0.000070    0.01    1    0.0000700000
Opening tables          0.000031    0.00    1    0.0000310000
statistics              0.000024    0.00    1    0.0000240000
init                    0.000020    0.00    1    0.0000200000
(shorter times not included)

クエリ 2:

select * from 多くの行を持つ 4 つのテーブルを、primary_key-foreign_key またはインデックス付きの列で結合します。

「1 つのクエリの所要時間: 0.156 秒 (+ 10.140 秒のネットワーク)」(以下の時間の合計が合計よりも多くなりますか?)

STATE           Total_R    Pct_R    Calls    R/Call
Sending data    16.424433    NULL    1    16.4244330000
freeing items   0.000390    NULL    1    0.0003900000
starting        0.000116    NULL    1    0.0001160000
statistics      0.000054    NULL    1    0.0000540000
Opening tables  0.000050    NULL    1    0.0000500000
init            0.000046    NULL    1    0.0000460000
preparing       0.000033    NULL    1    0.0000330000
optimizing     0.000028    NULL    1    0.0000280000
(shorter times not included)

クエリ 3: クエリ 2 と同じですが、select * の代わりに count * を使用します。

「1 回のクエリの所要時間: 10.047 秒」

STATE         Total_R   Pct_R  Calls  R/Call
Sending data  10.050007 NULL   1     10.0500070000
(shorter times not included)

多くの行を表示する必要がある場合、「期間」にネットワーク時間が含まれているように思えますが、これは、行を表示する必要がない場合、この時間を差し引くことができるという意味ではありません。本当のクエリの時間です。これは正しいと思いますか?

4

1 に答える 1

1

古い質問!ハイジは経過時間を「ネットワーク時間」としてカウントしていると確信しています -

  • ネットワークを介した最初の応答パケットの受信から
  • 結果セット内の最後の応答パケットの受信まで。

したがって、SELECT COUNT(*) FROM big _f_table クエリの場合、最初のパケットがすぐに返され、整数を含む単一の列があることが宣言されます。

その結果セットの残りは、クエリ エンジンが行のカウントを完了すると取得されます。したがって、ハイジのいわゆる「ネットワーク時間」は、行を数える時間です。これは、MyISAM の場合は実質的に瞬時であり、InnoDB の場合は時間がかかります。

あなたSELECT tons of columns FROM complex joinにも同じことが当てはまります。最初のパケットは、クエリ プランナーが結果セットに含まれる列を把握したときに到着します。最後のパケットは、コンピュータの内部ループバック (localhost) ネットワークを介してすべてのデータが最終的に Heidi に転送されたときに到着します。

これは、ブラウザの開発ツールに表示されるものと似ています。クエリ時間は「最初のバイトまでの時間」に類似しており、「ネットワーク時間」は残りの結果を配信する時間です。最初のバイトまでの時間は、クエリの解析/計画時間と、結果セットのメタデータのために何かを送信するのに十分な情報を取得する時間です。ネットワーク時間は、残りを取得する時間です。クエリ プランナーがテーブル ストレージから直接行をストリーミングできる場合、ネットワーク時間の割合が高くなります。一方、データをクランチする必要がある場合 (たとえば、ORDER BY を使用)、クエリ時間の割合が高くなります。しかし、このことを考えすぎないようにしてください。MariaDB と MySQL は非常に複雑で、キャッシュとフェッチのレイヤーがあります。クエリを満たす方法を理解するのが難しい場合があります。

于 2017-01-03T11:43:27.903 に答える