对于相同的模式/查询,MySQL和PostgreSQL之间的性能差异[关闭]


20

我是一名新手DBA,并且我在Microsoft SQL Server中有经验,但是我想跳到FLOSS。

我正在建立一家公司,我们用Postgres后端开发了一个应用程序(PHP),并且还进行了一些与MySQL比较的测试。我们观察到MySQL的速度是PostgreSQL的两倍。

我进行了明显的性能测试:

  • 表中的相同列,具有等效的列数据类型。
  • 行数相同。
  • 两者中的索引相同(包括主键)。
  • CPU负载处于空闲状态,而Postgres机器则要好得多。
  • 和相同的查询(显然)。

我究竟做错了什么?

PS:我阅读了许多有关数据库引擎性能调整的“ howtos”。
PS(2):我们在MySQL数据库上使用InnoDB(每个表一个文件)。


嗨,垫子!

我做了三个常见的选择(也是最难的)查询。

关于磁盘的问题,肯定是不一样的。在Postgres中,它是SSD(快三倍)。

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中查看此内容。

提前致谢。


抱歉,我的英语
哈维尔·瓦伦西亚

(您的英语很好。)您是否进行了负载测试,或者只是进行了单个查询?您能否显示您使用的数据库设置(尤其是诸如高速缓存大小之类的东西)?(我猜这两种情况下都使用相同的磁盘吗?)
Mat

1
您可以使用来发布查询和Postgres执行计划吗explain analyze?为了便于阅读,您可以将计划上传到explain.depesz.com
a_horse_with_no_name

1
如果Postgres在SSD上运行,则几乎可以肯定需要调整postgresql.conf
a_horse_with_no_name 2013年

1
@JavierValencia:如果您能够解决问题,请添加一个答案,描述您的工作,以便其他人可以从中学到。您也可以接受自己的答案,以将此问题标记为已解决
a_horse_with_no_name 2013年

Answers:


41

MySQL和PostgreSQL在性能方面存在很大差异。InnoDB和PostgreSQL表针对不同种类的查询进行了优化。理解这些差异对于理解如何从两者中获得良好的性能很重要。

例如,让我们看一下最明显的区别。

PostgreSQL vs MySQL / InnoDB表结构及其对性能的意义

通常,在复杂的工作负载下,PostgreSQL会更快,但是在简单的主键查找中,带有InnoDB的MySQL会更快。

PostgreSQL表是堆表。无法选择建立不是堆表的表。该cluster命令仅重写由指定索引排序的堆。索引然后为具有各种值的元组提供堆位置。索引不能按物理顺序遍历,只能按逻辑顺序遍历,因此它们具有大量的随机磁盘I / O,而按顺序读取表通常意味着大量的顺序磁盘I / O,因为您可以按物理顺序读取表。顺序磁盘I / O可以使用预读缓存和其他一些操作系统级别的优化。

这意味着如果您需要大量的记录或几页,通常从磁盘读取页面通常会更快。另一方面,对表的主键查找需要命中索引,查找文件中的位置,然后命中堆表并提取记录。这意味着许多随机磁盘I / O。

InnoDB使用不同的方法。对于InnoDB,该表是b树索引,索引有效载荷中包含实际数据。这意味着主键查找已经可以从叶页中提取数据,因此所需的随机磁盘I / O更少。同时,索引扫描需要遍历两个索引而不是遍历一个索引,这意味着使用除主键之外的任何索引最终会变得更慢,而顺序扫描仍然会更慢。

在PostgreSQL中进行诊断

我认为您想使用类似以下内容的方法:

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

这将为您提供查询计划,初始估计,实际时间,缓冲区使用率等等。


4
+1以解释(分析,缓冲,详细)
karmakaze 2015年

@ChrisTravers感谢您的出色回答!您说:“ ...(InnoDB的顺序扫描速度较慢”)。您能否解释一下在这种情况下顺序扫描的含义?
VB_

谢谢。我将修改答案。InnoDB中的“顺序”扫描按索引逻辑顺序进行,因此您拥有更多的随机I / O,并且没有预读缓存的帮助。
克里斯·特拉弗斯

感谢您的答复。对于任何对postgres内部结构感到好奇的人,我建议这篇文章:interdb.jp/pg/pgsql01.html说明Postgres如何将数据存储为堆表。
hqt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.