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


20

私は初心者DBAであり、Microsoft SQL Serverの経験がありますが、FLOSSにジャンプしたいです。

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

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

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

何が間違っていますか?

PS:データベースエンジンのパフォーマンスチューニングに関する「ハウツー」をたくさん読みました。
PS(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でこれを表示する方法がわかりません。

前もって感謝します。


申し訳ありませんが私の英語
ハビエルバレンシア

(あなたの英語は大丈夫です。)負荷テストを行いましたか、それとも個々のクエリを行いましたか?使用したデータベース設定(特にキャッシュサイズなど)を表示できますか?(どちらの場合も同じディスクだと思いますか?)
マット

1
を使用してクエリとPostgres実行計画を投稿できますかexplain analyze。読みやすくするために、あなたはに計画をアップロードすることができexplain.depesz.com
a_horse_with_no_name

1
PostgresがSSDで実行されている場合、ほぼ確実に調整する必要がありますpostgresql.conf
-a_horse_with_no_name

1
@JavierValencia:問題を修正できた場合は、他の人がそれから学ぶことができるように、あなたがしたことを説明する答えを追加してください。この質問を解決済みとしてマークするために、独自の回答を受け入れることもできます
-a_horse_with_no_name

回答:


41

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

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

PostgreSQLとMySQL / InnoDBのテーブル構造とパフォーマンスの意味

一般に、複雑なワークロードではPostgreSQLは高速になりますが、単純なプライマリキールックアップではInnoDBを使用したMySQLが高速になります。

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

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

InnoDBは異なるアプローチを使用します。InnoDBでは、テーブルはインデックスペイロードに実際のデータを持つbツリーインデックスです。これは、プライマリキールックアップがすでにリーフページからデータを取得することを意味するため、これに必要なランダムディスクI / Oは少なくなります。同時に、インデックススキャンでは、1つではなく2つのインデックスをスキャンする必要があります。つまり、主キー以外のインデックスの使用は遅くなり、順次スキャンはさらに遅くなります。

PostgreSQLで診断を取得する

次のようなものを使用したいと思います。

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

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


4
EXPLAIN(分析、バッファ、詳細)の+1
カルマカゼ

@ChrisTravers素晴らしい回答をありがとう!あなたは言った:「...(InnoDBの)シーケンシャルスキャンは遅い」。このコンテキストでの連続スキャンとはどういう意味ですか?
VB_

ありがとう。答えを修正します。InnoDBの「順次」スキャンはインデックス論理の順序で行われるため、よりランダムなI / Oが発生し、先読みキャッシングの助けはありません。
クリストラバーズ

いい答えをありがとう。postgresの内部に興味がある人には、この投稿をお勧めします。interdb.jp / pg / pgsql01.html Postgresがデータをヒープテーブルとして保存する方法を説明します。
hqt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.