我的笔记本电脑上安装了 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 上创建任何索引。
谢谢,
马立克