数据库:是磁盘上的一系列物理文件,mysql的数据库为一堆frm、MYD、MYI、ibd文件。
数据库管理系统(DBMS):由数据库+数据库实例构成
数据库实例(instance)与进程:数据库后台线程+共享内存,一个mysql数据库实例在系统表现上就是一个服务进程
线程: mysql架构为单进程多线程设计。
连接mysql就是连接进程和mysql数据库实例进程间的通信
数据库后台线程:
作用:
- 负责刷新内存池中的数据,保证缓冲池中的内存 缓存的是最近的数据
- 将已修改的数据文件刷新到磁盘文件
- 保证数据库发生异常时,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 存储引擎的性能
内存池:
作用:
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据以便快速读取,同时在修改磁盘文件数据之前在这里缓存
- 重做日志缓冲等
查看前台进程:
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中的计划任务)
本文介绍了MySQL数据库的组成部分,包括数据库作为物理文件、数据库管理系统包含数据库与实例,以及数据库实例由后台线程和共享内存构成。重点讨论了MySQL的单进程多线程设计,特别是Master Thread、IO Thread、Purge Thread和Page Cleaner Thread的角色,它们确保数据一致性、处理异步IO、回收undo页和刷新脏页。此外,还提到了内存池的作用,如缓存数据和维护内部数据结构。最后,简单提及了前台进程,如用户连接线程和事件调度器。
2827

被折叠的 条评论
为什么被折叠?



