【问题标题】:Increase connections to mysql cause rising sending data time in each on same query增加与 mysql 的连接会导致同一查询中每个查询的发送数据时间增加
【发布时间】:2017-09-14 11:40:48
【问题描述】:

在 php 中分叉多个进程(主管)。每个都创建与相同 Mysql DB 的连接并并行执行相同的 SELECT 查询(Gearman)。如果我增加进程数量(即同时连接)并且更多相同的查询将并行运行,从而增加每个进程中 SHOW PROCESSLIST 中的发送数据时间。这是一个简单的选择,事务级别为 READ UNCOMMITED。这是一些mysql配置问题吗?还是 SELECT 查询导致表锁?或者可能是全扫描?

服务器:Ubuntu 16.04.2 LTS。 1个CPU核心。 MySQL 5.7.17。 innodb_buffer_pool_size 12 GB

【问题讨论】:

  • 可能与网络延迟、表结构、索引和查询效率有关。因此,您应该提供有关架构和查询的更多详细信息。
  • 它使用 32 个表,包括自连接(13 个唯一表)在一个连接中在 3 秒内执行,但在两个并行中,每个进程需要 6 秒,依此类推,就像它们在队列中执行一样。查询足够大,有很多连接,但没有任何聚合和排序。只有一个表扫描 4262 行 using_where 和 45 % 过滤,其他使用索引
  • 看起来您正在锁定每个查询中的表。你在使用 BEGIN TRANSACTION 吗?
  • 如果每个查询再增加约 3 秒,显然会锁定表。
  • 不,没有 BEGIN TRANSACTION 并且自动提交已打开。但是为什么要简单的读锁表呢?即使在 READ UNCOMMITED 模式下。是全表扫描的原因吗?但我在 EXPLAIN 中看不到它

标签: mysql select parallel-processing innodb gearman


【解决方案1】:

它使用 32 个表,包括在一个连接中在 3 秒内执行的自连接(13 个唯一表)

得看看细节。听起来像是缺少索引或索引不足。

这是“Entity-Attribute-Value”吗?如果是,你有没有按照这里的提示操作:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

InnoDB 不锁定表。但它可能正在执行将锁定所有行的表扫描。同样,听起来像是错误的索引和/或查询公式。

请为所有 13 张桌子提供SHOW CREATE TABLE,以及SELECTEXPLAIN SELECT ...

如果在后台进行某种写入,这可能会影响SELECT,即使在READ UNCOMMITTED 模式下也是如此。

至少 16GB 的 RAM?

分叉多少个进程?你有多少个 CPU 内核?

【讨论】:

  • 1 个 CPU 内核,15GB RAM。即使是 2 个过程也会导致每个过程增加两次时间。整个数据库上没有插入/更新活动。是的,似乎有一个错误的查询。但不能很好地优化它,因为它是在API中实现的。那么水平分片会有所帮助吗?
  • 也许 CPU 在运行时处于 100%?这可以解释一个 3s; 6s for 2. 如果不能改变生成的查询,就不能实现分片。让我们看看查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2019-07-24
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多