私は初心者のDBAであり、Microsoft SQL Serverの経験はありますが、FLOSSに飛び込もうと思っています。
私は会社を始めており、Postgresバックエンドを使用してアプリ(PHP)を開発し、MySQLと比較するいくつかのテストも行いました。 MySQLはPostgreSQLの2倍の速度です。
私は具体的なパフォーマンステストを行いました。
何が悪いのですか?
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でこれを表示する方法がわかりません。
前もって感謝します。
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];
これにより、クエリプラン、初期推定、実際の時間、バッファ使用量などが得られます。