web-dev-qa-db-ja.com

同じスキーマ/クエリに対するMySQLとPostgreSQLのパフォーマンスの違い

私は初心者のDBAであり、Microsoft SQL Serverの経験はありますが、FLOSSに飛び込もうと思っています。

私は会社を始めており、Postgresバックエンドを使用してアプリ(PHP)を開発し、MySQLと比較するいくつかのテストも行いました。 MySQLはPostgreSQLの2倍の速度です。

私は具体的なパフォーマンステストを行いました。

  • 同等の列データ型を持つテーブル内の同じ列。
  • 同じ行数。
  • 両方で同じインデックス(主キーを含む)。
  • CPU負荷はアイドル状態で、Postgresマシンはそれよりもはるかに優れています。
  • そして、同じクエリ(明らかに)。

何が悪いのですか?

PS:私はデータベースエンジンのパフォーマンスチューニングに関する多くの「ハウツー」を読みました。
P.S(2):MySQLデータベースでInnoDB(テーブルごとに1つのファイル)を使用しています。


こんにちはマット!

私は3つの一般的な選択(および最も難しい)クエリを実行しました。

ディスクに関する質問、確かに同じではありません。 PostgresではSSDです(ほぼ3倍の速さ)。

MySQLキャッシュデータ:

+------------------------------+----------------------+
| Variable_name                | Value                |
+------------------------------+----------------------+
| binlog_cache_size            | 32768                |
| have_query_cache             | YES                  |
| key_cache_age_threshold      | 300                  |
| key_cache_block_size         | 1024                 |
| key_cache_division_limit     | 100                  |
| max_binlog_cache_size        | 18446744073709547520 |
| query_cache_limit            | 1048576              |
| query_cache_min_res_unit     | 4096                 |
| query_cache_size             | 16777216             |
| query_cache_type             | ON                   |
| query_cache_wlock_invalidate | OFF                  |
| table_definition_cache       | 256                  |
| table_open_cache             | 64                   |
| thread_cache_size            | 8                    |
+------------------------------+----------------------+

PostgreSQLでこれを表示する方法がわかりません。

前もって感謝します。

20
Javier Valencia

MySQLとPostgreSQLはパフォーマンスの点でかなり異なります。 InnoDBおよびPostgreSQLテーブルは、さまざまな種類のクエリ用に最適化されています。これらの違いを理解することは、どちらかから優れたパフォーマンスを得る方法を理解するために重要です。

例として、最も明白な違いを見てみましょう。

PostgreSQL vs MySQL/InnoDBテーブル構造とこれがパフォーマンスに与える意味

一般に、複雑なワークロードではPostgreSQLの方が高速ですが、単純な主キールックアップでは、MySQL InnoDBの方が高速です。

PostgreSQLテーブルはヒープテーブルです。ヒープテーブルではないテーブルを作成するオプションはありません。 clusterコマンドは、指定されたインデックスによって順序付けられたヒープを単に書き換えます。インデックスは、さまざまな値を持つタプルのヒープ位置を提供します。インデックスは物理的な順序では走査できず、論理的な順序でのみ走査できるため、テーブルを連続して読み取るときにランダムなディスクI/Oが大量に発生します。これは、物理的な順序でテーブルを読み取ることができるため、通常、大量の順次ディスクI/Oを意味します。シーケンシャルディスクI/Oは、先読みキャッシュと他のいくつかのOSレベルの最適化を使用します。

つまり、レコードのかなりの部分または数ページ以上が必要な場合は、通常、ディスクからページを読み取るだけの方が高速です。一方、テーブルの主キールックアップでは、インデックスをヒットし、ファイル内の場所をルックアップして、ヒープテーブルをヒットし、レコードをプルする必要があります。これは、ランダムなディスクI/Oの数を意味します。

InnoDBは異なるアプローチを使用します。 InnoDBでは、テーブルはインデックスペイロード内の実際のデータを含むBツリーインデックスです。これは、主キーのルックアップがすでにリーフページからデータをプルするようになっていることを意味し、ランダムなディスクI/Oの必要性が少なくなります。同時に、インデックススキャンでは、1つではなく2つのインデックスをトラバースする必要があります。つまり、主キー以外のインデックスの使用は遅くなり、シーケンシャルスキャンはさらに遅くなります。

PostgreSQLでの診断の取得

私はあなたが次のようなものを使いたいと思います:

 EXPLAIN (analyse, buffers, verbose)
 [query];

これにより、クエリプラン、初期推定、実際の時間、バッファ使用量などが得られます。

43
Chris Travers