MySQL中的多线程?

chu*_*tar 5 mysql concurrency multithreading computer-science query-optimization

MySQL操作是多线程的吗?

具体来说,在运行select时,select(或join)算法是否会产生多个线程一起运行?多线程会阻止能够支持很多并发用户吗?

Yar*_*lav 9

根据MySQL 8.0参考手册FAQ : General

\n
\n

是的。MySQL 是完全多线程的,并利用所有可用的 CPU。并非所有 CPU 都可用;现代操作系统应该能够利用所有底层 CPU,而且还可以将进程限制为特定 CPU 或 CPU 组。\n在 Windows 上,当前 mysqld 可以使用的(逻辑)处理器数量受到限制使用:单个处理器组,最多限制为 64 个逻辑处理器。\n可以通过以下方式查看多核的使用:\n单个核通常用于为一个会话发出的命令提供服务。\n一些背景知识线程对额外核心的使用有限;例如,保持后台 I/O 任务移动。\n如果数据库受 I/O 限制(通过 CPU 消耗小于容量来表示),则添加更多 CPU 是徒劳的。如果数据库被分区为 I/O 绑定部分和 CPU 绑定部分,添加 CPU 可能仍然有用。

\n
\n

但不适用于单个查询。\n只有修改查询才能实现并行执行。在这篇文章中可以找到很好的例子, 通过并行查询执行来提高慢查询性能

\n
\n

现在我们可以运行一些查询。第一个查询非常简单:查找每年的所有航班(在美国):

\n
\n
    select yeard, count(*) from ontime group by yeard\n
Run Code Online (Sandbox Code Playgroud)\n
\n

由于我们在 YearD 上有索引,因此查询将使用该索引。查询很简单,但是需要扫描 150M 行。该查询耗时 54 秒,仅使用 1 个 CPU 核心。然而,这个查询非常适合并行运行。我们可以运行 26 个并行查询,每个查询都会计算自己的年份。I\xe2\x80\x99ve 使用以下 shell 脚本在后台运行查询:

\n
\n
    #!/bin/bash\n    date\n    for y in {1988..2013}\n    do\n      sql="select yeard, count(*) from ontime where yeard=$y"\n      mysql -vvv ontime -e "$sql" &>par_sql1/$y.log & \n    done\n    wait\n    date\n
Run Code Online (Sandbox Code Playgroud)\n

开始时间: 2014 年东部标准时间 11:41:21

\n

结束时间:2014 年美国东部时间 11:41:26

\n

因此总执行时间约为 5 秒(快 10 倍)。

\n


Pet*_* G. 6

MySQL 服务器中运行多个后台线程。此外,每个数据库连接都由单个线程提供服务。MySQL 中未实现并行查询(使用多个线程进行选择)。

MySQL本身可以支持“大量并发用户”。例如 Facebook 就通过 MySQL 成功起步。