MySQL中的多线程?

Posted

技术标签:

【中文标题】MySQL中的多线程?【英文标题】:Multithreading in MySQL? 【发布时间】:2010-10-07 15:21:17 【问题描述】:

mysql 操作是多线程的吗?

具体来说,在运行选择时,选择(或连接)算法是否会产生多个线程一起运行?多线程会阻止支持大量并发用户吗?

【问题讨论】:

您的意思是“单线程会阻止...”吗? 【参考方案1】:

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

MySQL 可以支持“大量并发用户”。例如 Facebook 使用 MySQL 成功启动。

【讨论】:

这是否意味着在给定的数据库中,一个连接必须在另一个连接开始查询或更改数据之前结束?【参考方案2】:

根据MySQL 8.0 reference manual FAQ:一般

是的。 MySQL 是完全多线程的,并利用了所有可用的 CPU。并非所有 CPU 都可用;现代操作系统应该能够利用所有底层 CPU,但也可以将进程限制为特定的 CPU 或 CPU 组。 在 Windows 上,目前对 mysqld 可以使用的(逻辑)处理器的数量有限制:单个处理器组,最多限制为 64 个逻辑处理器。 可以通过以下方式看到多个内核的使用: 单个核心通常用于服务从一个会话发出的命令。 一些后台线程对额外内核的使用有限;例如,保持后台 I/O 任务移动。 如果数据库是 I/O 密集型的(通过 CPU 消耗小于容量来表示),那么添加更多 CPU 是徒劳的。如果数据库被划分为 I/O-bound 部分和 CPU-bond 部分,添加 CPU 可能仍然有用。

但不适用于单个查询。 只能通过修改查询来实现并行执行。很好的例子可以在这篇文章中找到increasing slow query performance with parallel query execution:

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

    select yeard, count(*) from ontime group by yeard

由于我们在 YearD 上有索引,因此查询将使用该索引。查询很简单,但是它必须扫描 150M 行。查询耗时 54 秒,仅使用了 1 个 CPU 内核。但是,此查询非常适合并行运行。我们可以运行 26 个并行查询,每个查询都有自己的年份。我使用以下 shell 脚本在后台运行查询:

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

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

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

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

【讨论】:

【参考方案3】:

除了每个连接都有一个线程外,还有几个管理进程都有自己的线程。这是 DBMS 中常见的一种安排。例如。 Oracle RDMS 有 System Monitor、DB Writer 等。这项运动是缓存读取和惰性写入。

【讨论】:

以上是关于MySQL中的多线程?的主要内容,如果未能解决你的问题,请参考以下文章

VB中的多线程

python中的多线程

详解python中的多线程

java中的多线程

Python中的多线程并行运行

actionscript 中的多线程还是绿色线程?