我有在 Mysql(InnoDB) slave 上执行如下查询的进程
INSERT ignore INTO user_profile_temp (some_fields)
select some_fields from user_profile
user_profile 是 8GB 的 bigtable,使用 HDD 需要 1 到 2 个小时。
由于这个查询,复制(主到从)正在队列中等待完成上述查询。可能会有 1 到 2 小时的延迟。
由于选择查询而发生延迟。由于选择查询将仅在行级别获取共享锁,这意味着复制记录不会影响当前正在读取的进程,应该能够并行更新记录。
我的问题是,如果任何用户进程在那一刻运行,复制进程是否会等待,或者如果它不影响相同的行/表,它可以并行运行?
这取决于。
旧版本的 MySQL 一次运行一个复制查询。较新的版本可以实现某种程度的并行性。
同时,对 Slave 的查询可以并行运行,就像读取和写入可以在单个服务器上并行运行一样。如果写入(来自复制)和读取(来自从属上的用户)没有触及同一张表的相同行,那么它们可以并行进行。但是如果一个重要的锁被一个人取出,另一个人必须等待。或者陷入僵局。
目前尚不清楚您
INSERT
的来源。它不应该来自奴隶,因为奴隶应该是只读的。如果它来自复制流,那么正在运行什么版本的 MySQL 以及它是如何配置的?