【问题标题】:PostgreSQL vs MySQL simple query performancePostgreSQL vs MySQL 简单查询性能
【发布时间】:2015-07-12 13:19:47
【问题描述】:

我正在使用一个新的 Web 应用程序。我已经将 MySQL 用于 Web 应用程序。但现在我正在研究 PostgreSQL 选项。 我做了一个简单的性能测试,发现 PostgreSQL 比 MySQL 慢。

当您制作网站/Web 应用程序时,您需要处理每个请求的大量初始化查询。 我的测试:

PgSQL
30000 pgsql execs - 73.53459s
30000 pgsql execs - 88.41614s
30000 pgsql execs - 75.76565s
-----------------------------
Average             79.23879s
378 queries per second or ~2.6 ms per query

MySQL
30000 mysql execs - 22.19208s
30000 mysql execs - 17.81079s
30000 mysql execs - 23.30936s
-----------------------------
Average             21,10407s 
~1421 query per second or ~0.7 ms per query

MySQL 的运行速度比 PostgreSQL 快约 4 倍。 正常吗?我不能使用具有大量连接的 PostgreSQL 到 Web 应用程序 (SAAS) 吗?

*我对并发访问进行的另一项测试让我非常担心。

测试代码 (equal 和 teste 表都只有 2 条记录和一个 id_teste 索引):

<?php
  $db = new PDO('pgsql:host=127.0.0.1 dbname=teste user=postgres password=123456');

  $t = 30000;
  $ini = microtime(true);
  for ($i=0;$i<$t;$i++)
  {
    $ex = $db->prepare('select * from teste where id_teste = 1');
    $ex->execute();
  }
  $end = microtime(true);
  echo '<b>'. $t .'</b> pgsql execs - <b>'. number_format($end-$ini,5,'.','') .'</b>s';
?>

更新: MySQL 表引擎是 Innodb。两项测试均在同一设备中进行。 我用mysqli_query和pg_query做了一个新的测试,结果更好:

30000 pgsql execs - 28.18265s
30000 pgsql execs - 23.54120s
30000 pgsql execs - 23.43689s
Average             25,05358s
~1197 queries per second or ~0,8 ms per query


30000 mysql execs - 23.89033s
30000 mysql execs - 19.40293s
30000 mysql execs - 27.75116s
Average             23,68147s
~1266 queries per second or ~0,79 ms per query

也许 PDO pgsql 驱动程序是评论的问题,或者 mysqli 很慢。

关于简单查询的其他选项,例如缓存,是的,这是一个选项,但它在大表中有许多简单查询,这些数据需要存储在 RDBMS 中。示例:城市、人员、用户、页面。他们都只使用了 id = X 的地方。尽管我们可以处理更多的工作。

【问题讨论】:

  • mysql上有哪些表类型?
  • 我无法想象任何 Web 应用程序只在(几乎)空表上执行这个(!)非常简单的查询。如果性能很重要,为什么要引入像 PDO 这样的开销?
  • 玩具微基准。如果您只想要在琐碎查询上的超快速性能,请使用 K/V 存储而不是 RDBMS。通常,您使用 Redis 之类的东西作为缓存层,然后使用 RDBMS 进行持久且强大的存储和分析。
  • 你的测试真的毫无价值(没有冒犯)。还不如用机车拉着婴儿车来测算走10米的时间。
  • 您的准备​​语句在循环内完成,您准备相同的语句 30000 次。并且在使用 pg 函数时,您还可以使用 pg_prepare() 来准备查询。 PDO 只是开销,仅在支持许多不同的数据库时才有意义。但在这种情况下,ORM 就更有意义了。 PHP + PostgreSQL 快如闪电,除非你让它变慢。

标签: mysql performance postgresql


【解决方案1】:

这取决于很多因素 - 表大小、索引、MySQL 中的引擎、操作系统。

对于这些超简单的查询,Postgres 可能比 MySQL 慢 - PostgreSQL 有更丰富的规划器,在更复杂的查询上效果更好,但在琐碎的查询上速度较慢。

但在您的示例中,强大的因素也可能是 PDO 驱动程序的速度。另一个问题是您是否使用池连接。如果没有池连接,连接的开销比查询执行要大。对于像 pgbouncer 这样的快速查询,pgpool 是必要的。

在现实世界中,真正的瓶颈是 IO 速度和 SQL 规划器质量。但是您的测试不会从中检查任何内容。

【讨论】:

  • 连接只建立一次,在这个“测试”中是否使用连接池无关紧要。但你确实需要一个:-)
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多