MySQL 和 PostgreSQL 对于相同模式/查询的性能差异

Jav*_*cia 20 mysql postgresql testing

我是 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                    |
+------------------------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

我不知道如何在 PostgreSQL 中查看它。

提前致谢。

Chr*_*ers 44

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

举个例子,让我们看看最明显的区别。

PostgreSQL 与 MySQL/InnoDB 表结构及其对性能的影响

一般来说,在复杂的工作负载上,PostgreSQL 会更快,但在简单的主键查找上,MySQL 和 InnoDB 会更快。

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

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

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

在 PostgreSQL 中获得诊断

我想你想使用类似的东西:

 EXPLAIN (analyse, buffers, verbose)
 [query];
Run Code Online (Sandbox Code Playgroud)

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

  • +1 表示 EXPLAIN(分析、缓冲区、详细) (4认同)