增加到mysql的连接会导致在相同查询中每个发送数据时间上升
在php(Supervisor)中分叉多个进程。每个都创建与同一个Mysql数据库的连接,并行执行相同的SELECT查询(Gearman)。如果我增加进程数量(即同一时间连接)并且更多相同的查询将并行运行将导致在每个进程的SHOW PROCESSLIST中增加发送数据时间。这是一个简单的选择,事务级别READ UNCOMMITED。它是一些MySQL配置问题?或者SELECT查询导致表锁?或者,也许全面扫描呢?增加到mysql的连接会导致在相同查询中每个发送数据时间上升
服务器:Ubuntu 16.04.2 LTS。 1个CPU核心。 MySQL 5.7.17。 innodb_buffer_pool_size 12 GB
它使用32个表包括自我连接(13页独特的表)中的一个连接
得在3秒内执行看到的细节。听起来像缺少或不足索引。
这是“实体 - 属性 - 值如果是这样,你跟着这里的提示:。http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
InnoDB的不锁表,但它可能是做这将锁定所有行表扫描同样,声音如不良的索引和/或查询公式。
请提供SHOW CREATE TABLE
所有13桌,再加上SELECT
和EXPLAIN SELECT ...
。
如果有某种写在后台发生的情况,这可能影响SELECT
,甚至在READ UNCOMMITTED
模式。
至少16GB的RAM?
分叉多少个进程?你有多少个CPU核心?
中看到它1个CPU核心,15GB RAM。即使是2个过程也会导致每次增加两次。整个数据库没有插入/更新活动。是的,似乎有一个错误的查询。但是不能很好地优化它,导致它在API中实现。那么水平分片可能有帮助吗? –
也许CPU运行时处于100%的状态?这可以解释为3的一个; 6s for 2.如果您无法更改生成的查询,则无法实现分片。让我们看看查询。 –
可能是关于网络延迟,表结构,索引和查询效率。所以,你应该提供关于你的模式和查询的更多细节。 – abeyaz
它使用32个表,包括在一个连接中在3秒内执行的自连接(13个唯一表),但是在两个并行中,每个进程需要6秒钟等等,就像它们在队列中执行一样。查询对于许多连接来说足够大,但没有任何聚合和排序。只有一个表使用using_where扫描4262行,并使用索引进行了45%筛选,其他使用索引 –
看起来您正在每个查询中锁定表。你在使用BEGIN TRANSACTION吗? – abeyaz