Mysql 数据库、实例、进程和线程

本文介绍了MySQL数据库的组成部分,包括数据库作为物理文件、数据库管理系统包含数据库与实例,以及数据库实例由后台线程和共享内存构成。重点讨论了MySQL的单进程多线程设计,特别是Master Thread、IO Thread、Purge Thread和Page Cleaner Thread的角色,它们确保数据一致性、处理异步IO、回收undo页和刷新脏页。此外,还提到了内存池的作用,如缓存数据和维护内部数据结构。最后,简单提及了前台进程,如用户连接线程和事件调度器。

数据库:是磁盘上的一系列物理文件,mysql的数据库为一堆frm、MYD、MYI、ibd文件。

数据库管理系统(DBMS):由数据库+数据库实例构成

数据库实例(instance)与进程:数据库后台线程+共享内存,一个mysql数据库实例在系统表现上就是一个服务进程

线程: mysql架构为单进程多线程设计。

连接mysql就是连接进程和mysql数据库实例进程间的通信

数据库后台线程:

作用:

  1. 负责刷新内存池中的数据,保证缓冲池中的内存 缓存的是最近的数据
  2. 将已修改的数据文件刷新到磁盘文件
  3. 保证数据库发生异常时,InnoDB 能恢复到正常运行状态

查看后台进程:

mysql> select name, type, thread_id, processlist_id from performance_schema.threads where type='BACKGROUND';
Current database: *** NONE ***

+---------------------------------------------+------------+-----------+----------------+
| name                                        | type       | thread_id | processlist_id |
+---------------------------------------------+------------+-----------+----------------+
| thread/sql/main                             | BACKGROUND |         1 |           NULL |
| thread/innodb/io_ibuf_thread                | BACKGROUND |         3 |           NULL |
| thread/innodb/io_log_thread                 | BACKGROUND |         4 |           NULL |
| thread/innodb/io_read_thread                | BACKGROUND |         5 |           NULL |
| thread/innodb/io_read_thread                | BACKGROUND |         6 |           NULL |
| thread/innodb/io_read_thread                | BACKGROUND |         7 |           NULL |
| thread/innodb/io_read_thread                | BACKGROUND |         8 |           NULL |
| thread/innodb/io_write_thread               | BACKGROUND |         9 |           NULL |
| thread/innodb/io_write_thread               | BACKGROUND |        10 |           NULL |
| thread/innodb/io_write_thread               | BACKGROUND |        11 |           NULL |
| thread/innodb/io_write_thread               | BACKGROUND |        12 |           NULL |
| thread/innodb/page_flush_coordinator_thread | BACKGROUND |        13 |           NULL |
| thread/innodb/log_checkpointer_thread       | BACKGROUND |        14 |           NULL |
| thread/innodb/log_flush_notifier_thread     | BACKGROUND |        15 |           NULL |
| thread/innodb/log_flusher_thread            | BACKGROUND |        16 |           NULL |
| thread/innodb/log_write_notifier_thread     | BACKGROUND |        17 |           NULL |
| thread/innodb/log_writer_thread             | BACKGROUND |        18 |           NULL |
| thread/innodb/srv_lock_timeout_thread       | BACKGROUND |        21 |           NULL |
| thread/innodb/srv_error_monitor_thread      | BACKGROUND |        22 |           NULL |
| thread/innodb/srv_monitor_thread            | BACKGROUND |        23 |           NULL |
| thread/innodb/buf_resize_thread             | BACKGROUND |        24 |           NULL |
| thread/innodb/srv_master_thread             | BACKGROUND |        25 |           NULL |
| thread/innodb/dict_stats_thread             | BACKGROUND |        26 |           NULL |
| thread/innodb/fts_optimize_thread           | BACKGROUND |        27 |           NULL |
| thread/mysqlx/worker                        | BACKGROUND |        28 |           NULL |
| thread/mysqlx/worker                        | BACKGROUND |        29 |           NULL |
| thread/mysqlx/acceptor_network              | BACKGROUND |        30 |           NULL |
| thread/innodb/buf_dump_thread               | BACKGROUND |        34 |           NULL |
| thread/innodb/clone_gtid_thread             | BACKGROUND |        35 |           NULL |
| thread/innodb/srv_purge_thread              | BACKGROUND |        36 |           NULL |
| thread/innodb/srv_worker_thread             | BACKGROUND |        37 |           NULL |
| thread/innodb/srv_worker_thread             | BACKGROUND |        38 |           NULL |
| thread/innodb/srv_worker_thread             | BACKGROUND |        39 |           NULL |
| thread/sql/signal_handler                   | BACKGROUND |        41 |           NULL |
| thread/mysqlx/acceptor_network              | BACKGROUND |        42 |           NULL |
+---------------------------------------------+------------+-----------+----------------+
35 rows in set (0.13 sec)

关键线程介绍:

  • Master Thread:thread/sql/main,核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性。包括:刷新脏页、合并插入缓冲、UNDO 页的回收等
  • IO Thread: thread/innodb/io_[read|write]_* , InnoDB 引擎大量使用 AIO(Async IO)来处理写 IO 请求,IO Thread 负责这些 AIO 请求的回调,包括 4 个 read thread 和 4 个 write thread,读线程 ID 总是小于写线程
  • Purge Thread:事务提交后,其使用的 undolog 可能不再需要,Purge Thread 主要负责回收已经使用并分配的 undo 页.使用 SHOW VARIABLES LIK'innodb_purge_threads'\G 查看 Purge 线程个数为4
  • Page Cleaner Thread:负责将脏页刷新到磁盘中,原本该功能在 Master Thread 中,这样做减轻了 Master Thread 的工作,以及减少用户查询线程的阻塞,从而进一步提高 InnoDB 存储引擎的性能

内存池:

作用:

  1. 维护所有进程/线程需要访问的多个内部数据结构
  2. 缓存磁盘上的数据以便快速读取,同时在修改磁盘文件数据之前在这里缓存
  3. 重做日志缓冲等

查看前台进程:

mysql> select name, type, thread_id, processlist_id from performance_schema.threads where type='FOREGROUND';
+--------------------------------+------------+-----------+----------------+
| name                           | type       | thread_id | processlist_id |
+--------------------------------+------------+-----------+----------------+
| thread/sql/event_scheduler     | FOREGROUND |        40 |              5 |
| thread/sql/compress_gtid_table | FOREGROUND |        44 |              7 |
| thread/sql/one_connection      | FOREGROUND |       676 |            639 |
+--------------------------------+------------+-----------+----------------+
3 rows in set (0.00 sec)

主要线程介绍:

  • compress_gtid_table(GTID压缩线程):用于压缩mysql.gtid_executed表中的GTID记录数量
  •  one_connection(用户连接线程):用于处理用户请求的线程
  • event_scheduler(事件调度器):相当于操作系统中的定时任务(如:Linux中的cron、Window中的计划任务)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值