2

私のラップトップには PostgreSQL 9.2 と MySQL 5.5 (InnoDB) がインストールされています。既定のインストールを使用し、同じ CSV ファイルから入力された両方のデータベース エンジン。ca の「sales_reports」テーブルがあります。700K 行。

シナリオ 1:

  • 次のクエリ:

    名前、年、地域、支店で sales_reports グループから名前、年、地域、支店を選択します。

  • PostgreSQL 9.2: 合計クエリ実行時間: 42.14 秒、18064 行が取得されました

  • PostgreSQL の説明:
    グループ (コスト=165091.16..174275.61 行=73476 幅=58) (実際の時間=35196.959..41896.739 行=18064 ループ=1)
    -> ソート (コスト=165091.16..166928.05 行=734756 幅=58) (実際の時間=35196.956..41704.549 行=734756 ループ=1)
        ソートキー:名前、年、地域、支店
        ソート方法:外部マージディスク:49920kB
        -> sales_reports の Seq Scan (cost=0.00..38249.56 rows=734756 width=58) (実際の時間=0.048..282.331 rows=734756 loops=1)
    総実行時間: 41906.628 ミリ秒
    
  • MySQL 5.5 : 総クエリ実行時間: 4.4 秒、18064 行取得
  • MySQL の説明:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | 1 | シンプル | 販売レポート | すべて | ヌル | ヌル | ヌル | ヌル | 729433 | 一時的な使用; ファイルソートの使用 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    
  • PostgreSQL は 10 倍遅い

シナリオ 2:

  • 次のクエリ:
    name、year、region、branch、sum(sale) を sales_reports グループから sales_reports グループから name、year、region、branch で選択します。
  • PostgreSQL 9.2: 合計クエリ実行時間: 42.51 秒、18064 行が取得されました
  • PostgreSQL の説明:
    GroupAggregate (コスト=165091.16..176847.26 行=73476 幅=64) (実際の時間=35160.911..42254.060 行=18064 ループ=1)
    -> ソート (コスト=165091.16..166928.05 行=734756 幅=64) (実際の時間=35160.489..41857.986 行=734756 ループ=1)
        ソートキー:名前、年、地域、支店
        ソート方法: 外部マージ ディスク: 54760kB
        -> sales_reports の Seq Scan (cost=0.00..38249.56 rows=734756 width=64) (実際の時間=0.047..296.347 rows=734756 loops=1)
    総実行時間: 42264.790 ミリ秒
    
  • MySQL 5.5: 合計クエリ実行時間: 8.15 秒、18064 行取得
  • MySQL の説明:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | 1 | シンプル | 販売レポート | すべて | ヌル | ヌル | ヌル | ヌル | 729433 | 一時的な使用; ファイルソートの使用 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    
  • PostgreSQL は 5 倍遅い

シナリオ 3:

  • 次のクエリ:
    name、year、region、sum(sale) を sales_reports グループから sales_name、year、region で選択します。
  • PostgreSQL 9.2: 合計クエリ実行時間: 1 秒、18064 行が取得されました
  • PostgreSQL の説明:
    HashAggregate (コスト=45597.12..45655.62 行=5850 幅=37) (実際の時間=758.396..759.756 行=4644 ループ=1)
    -> sales_reports の Seq Scan (cost=0.00..38249.56 rows=734756 width=37) (実際の時間=0.061..116.541 rows=734756 loops=1)
    総実行時間: 760.133 ミリ秒
  • MySQL 5.5 : 総クエリ実行時間: 5.8 秒、18064 行取得
  • MySQL の説明:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | ID | select_type | テーブル | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    | | 1 | シンプル | 販売レポート | すべて | ヌル | ヌル | ヌル | ヌル | 729433 | 一時的な使用; ファイルソートの使用 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- --------------------------+
    
  • PostgreSQL は 5 倍高速

最初の 2 つのシナリオが PostgreSQL で非常に遅い理由はありますか?

ところで、PostgreSQL のクエリで使用しているフィールドのインデックスを作成しましたが、MySQL ではインデックスを作成しませんでした。

ありがとう、

マレク

4

2 に答える 2

14

デフォルトのpostgresql設定はかなり保守的です。手始めに、shared_buffers1GBに増やしてみてください。(変更を有効にするためにサーバーを再起動することを忘れないでください。)

また、work_memExplainでGroupAggregateがHashAggregateに切り替わるまで増やしてみてください。再起動せずにこれを変更できます。

警告の言葉:本番環境の設定をいじる前に、フレンドリーなマニュアルを読んでください。いくつかの落とし穴があります。

于 2012-09-27T15:29:52.463 に答える
1

いくつかのこと:

  1. varchar/text 列にインデックスを作成する場合 (おそらく名前のように)、group by ステートメントに PostgreSQL でハッシュ型インデックスを使用する方が高速な場合があります。
  2. mysql が MyISAM テーブルを使用している場合、MyISAM は InnoDB と PgSQL が持つ多くの安全性を無視するため、非同時ロードの方が高速になる可能性があります。
  3. pgsql データベースで真空分析を試す必要があります。
  4. 名前、年、地域、ブランチに複合インデックスを作成して、部分ごとのグループ化を高速化することができます。
于 2012-09-27T14:09:41.957 に答える