【发布时间】: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