2

我的笔记本电脑上安装了 PostgreSQL 9.2 和 MySQL 5.5 (InnoDB)。两个数据库引擎都使用默认安装并从同一个 CSV 文件填充。我有 'sales_reports' 表和 ca。700K 行。

场景一:

  • 以下查询:

    按名称、年份、地区、分支机构从 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(成本=0.00..38249.56 行=734756 宽度=58)(实际时间=0.048..282.331 行=734756 循环=1)
    总运行时间:41906.628 毫秒
    
  • MySQL 5.5:总查询运行时间:4.4 秒,检索到 18064 行
  • MySQL解释:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 1 | 简单 | 销售报告 | 全部 | 空 | 空 | 空 | 空 | 729433 | 使用临时的;使用文件排序 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    
  • PostgreSQL 慢 10 倍

场景二:

  • 以下查询:
    按名称、年份、地区、分公司从 sales_reports 组中选择名称、年份、地区、分公司、总和(销售)作为销售额;
  • 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(成本=0.00..38249.56 行=734756 宽度=64)(实际时间=0.047..296.347 行=734756 循环=1)
    总运行时间:42264.790 毫秒
    
  • MySQL 5.5:总查询运行时间:8.15 秒,检索到 18064 行
  • MySQL解释:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 1 | 简单 | 销售报告 | 全部 | 空 | 空 | 空 | 空 | 729433 | 使用临时的;使用文件排序 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    
  • PostgreSQL 慢 5 倍

场景 3:

  • 以下查询:
    按名称、年份、地区从 sales_reports 组中选择名称、年份、地区、总和(销售)作为销售;
  • PostgreSQL 9.2:总查询运行时间:1 秒,检索到 18064 行
  • PostgreSQL 解释:
    HashAggregate(成本=45597.12..45655.62 行=5850 宽度=37)(实际时间=758.396..759.756 行=4644 循环=1)
    -> sales_reports 上的 Seq Scan(成本=0.00..38249.56 行=734756 宽度=37)(实际时间=0.061..116.541 行=734756 循环=1)
    总运行时间:760.133 毫秒
  • MySQL 5.5:总查询运行时间:5.8 秒,检索到 18064 行
  • MySQL解释:
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    | 1 | 简单 | 销售报告 | 全部 | 空 | 空 | 空 | 空 | 729433 | 使用临时的;使用文件排序 |
    +----+-------------+---------------+------+------- --------+------+---------+------+--------+-------- -------------------------------------+
    
  • PostgreSQL 快 5 倍

任何想法为什么前两个场景在 PostgreSQL 上如此缓慢?

顺便说一句,我为在 PostgreSQL 上的查询中使用的字段创建了索引,我没有在 MySQL 上创建任何索引。

谢谢,

马立克

4

2 回答 2

14

默认的 postgresql 配置相当保守。对于初学者,请尝试增加到shared_buffers1GB。(请记住重新启动服务器以使更改生效。)

此外,尝试增加work_mem直到 GroupAggregate 在说明中切换到 HashAggregate。您无需重新启动即可更改此设置。

一句警告:在生产中搞乱设置之前,请阅读友好的手册,其中涉及一些陷阱。

于 2012-09-27T15:29:52.463 回答
1

一些东西:

  1. 在 varchar/text 列上创建索引时(可能是名称),在 PostgreSQL 中为 group by 语句使用散列类型索引可能会更快
  2. 如果 mysql 使用 MyISAM 表,它对于非并发加载可能会更快,因为 MyISAM 忽略了 InnoDB 和 PgSQL 所具有的许多安全性。
  3. 您应该尝试对您的 pgsql 数据库进行真空分析。
  4. 您可能希望在名称、年份、地区、分支上创建一个复合索引,以使该分组更快。
于 2012-09-27T14:09:41.957 回答