我正在mysql 5.7.18 ubuntu服务器16.04上运行一个sql脚本,它在一个表中执行大量更新。50k更新中的每一个更新都不到一秒钟,但总运行时间非常长(>20m)。
我从PROCESSLIST中可以看到,只有一个线程正在运行,并且正在一个接一个地处理更新。
如何使用多个线程来加快执行速度?
发布于 2017-06-09 13:12:07
因为你写了“每一个.”听起来像是在更新单个行。您是否探索过编写SQL,从而允许DB在一个SQL语句中更新多个行,而不是一次执行一行?这可能会给你带来比手工多线程更好的性能。
发布于 2020-02-06 11:32:34
从这本书,高性能MySQL -第二版-2008年:
MySQL不能在许多CPU上并行执行一个查询。这是一些其他数据库服务器提供的特性,但不是MySQL。我们提到它,这样您就不会花费大量的时间来研究如何在MySQL!https://www.oreilly.com/library/view/high-performance-mysql/9780596101718/ch04.html上并行执行查询。
来自Percona博客-2019年1月23日
最后: MySQL 8.0.14 (目前有限)具有执行并行查询执行的能力。在编写本报告时,它仅限于
select count(*) from table查询和检查表查询。https://www.percona.com/blog/2019/01/23/mysql-8-0-14-a-road-to-parallel-query-execution-is-wide-open/
发布于 2023-02-19 03:38:04
您可以使用xargs实现一些mysql并行性:
cat <./file.sql> | xargs -n <num of cores> -d '\n' -I {} mysql -e {}
xargs -d ' \n‘状态只使\n成为分隔符(如果每一行o .sql文件都有空格,则有用)
-n限制了xargs生成的每个命令行的参数数。如果没有-n 1并使用-P 0,有时可能只执行一个执行程序。
-P一次限制xargs生成进程的数量(缺省值为1)。-P 0(P0)与-P ($nproc)相同。
但是,尽管有多个实例o mysql并行运行(在单独的子subshells中),但性能不能达到2x。也许是DB锁的问题。
https://dba.stackexchange.com/questions/175888
复制相似问题