基于 MySQL 5.6 版本源码的学习笔记

# GTID

在集群全局范围标识事务,用于取代过去通过 binlog 定位复制文件的传统方式

GTID = source_id:transaction_id
1

source_id 就是事务发起的 MySQL 实例的 server_uuid
首次启动时自动生成并存储到 auto.cnf

transaction_id 是从 1 开始计数的事务 id
也可以是一个 id 区间,比如 1-5

一般使用时用的都是 GTID 集合(gtid_set),将多个 GTID 用英文逗号拼接

参考资料

# Performance Schema

是一套 MySQL 自身的性能监控机制
对应了 performance_schema 数据库

mysql> show tables;
+----------------------------------------------------+
| Tables_in_performance_schema                       |
+----------------------------------------------------+
| accounts                                           |
| cond_instances                                     |
| events_stages_current                              |
| events_stages_history                              |
| events_stages_history_long                         |
| events_stages_summary_by_account_by_event_name     |
| events_stages_summary_by_host_by_event_name        |
| events_stages_summary_by_thread_by_event_name      |
| events_stages_summary_by_user_by_event_name        |
| events_stages_summary_global_by_event_name         |
| events_statements_current                          |
| events_statements_history                          |
| events_statements_history_long                     |
| events_statements_summary_by_account_by_event_name |
| events_statements_summary_by_digest                |
| events_statements_summary_by_host_by_event_name    |
| events_statements_summary_by_thread_by_event_name  |
| events_statements_summary_by_user_by_event_name    |
| events_statements_summary_global_by_event_name     |
| events_waits_current                               |
| events_waits_history                               |
| events_waits_history_long                          |
| events_waits_summary_by_account_by_event_name      |
| events_waits_summary_by_host_by_event_name         |
| events_waits_summary_by_instance                   |
| events_waits_summary_by_thread_by_event_name       |
| events_waits_summary_by_user_by_event_name         |
| events_waits_summary_global_by_event_name          |
| file_instances                                     |
| file_summary_by_event_name                         |
| file_summary_by_instance                           |
| host_cache                                         |
| hosts                                              |
| mutex_instances                                    |
| objects_summary_global_by_type                     |
| performance_timers                                 |
| rwlock_instances                                   |
| session_account_connect_attrs                      |
| session_connect_attrs                              |
| setup_actors                                       |
| setup_consumers                                    |
| setup_instruments                                  |
| setup_objects                                      |
| setup_timers                                       |
| socket_instances                                   |
| socket_summary_by_event_name                       |
| socket_summary_by_instance                         |
| table_io_waits_summary_by_index_usage              |
| table_io_waits_summary_by_table                    |
| table_lock_waits_summary_by_table                  |
| threads                                            |
| users                                              |
+----------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

从 MySQL5.6 开始,Performance Schema 默认打开
数据收集是通过修改服务器源代码来实现的。 不同于其他功能(如复制或Event Scheduler),不存在与Performance Schema相关联的单独线程
服务器监控持续不中断地进行,花费很少

参考资料

# Event

事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。

事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

  • Events: event的入口模块,主要负责系统中events的加载卸载以及event的创建、删除、更改等操作。相关文件为events.h/events.cc。
  • Event_parse_data: sql解析后的event内部结构体。相关文件为event_parse_data.h/event_parse_data.cc
  • Event_scheduler: event的调度模块。相关文件为event_scheduler.h/event_scheduler.cc
  • Event_queue: Event任务的内存管理结构,内部实现为一个小顶堆,队头的event为最近需要执行的任务。Event scheduler会循环获取队头的event并执行。相关文件为event_queue.h/event_queue.cc。
  • Event_db_repository: mysql.event表的操作集合。相关文件为event_db_repository.h/event_db_repository.cc。
  • Event_queue_element: event queue element元素相关操作。相关文件为event_data_objects.h/event_data_objects.cc。
  • QUEUE: 大/小顶堆。除了event模块以外,其他的如partition/file_sort/unique/fts等模块或流程也在使用。在event中用于实现event任务的存放及排序。在5.6中相关文件为queues.h/queues.c,在5.7/8.0中相关的文件为priority_queue.h。

参考资料

# 空间数据

MySQL 支持空间数据(Spatial Data)、空间索引(Spatial Index)

MyISAM 支持空间索引和空间数据
Innodb 支持空间数据库,在 MySQL8.0 中开始支持空间索引

The spatial data types and functions are available for MyISAM, InnoDB, NDB, and ARCHIVE tables. For indexing spatial columns, MyISAM and InnoDB support both SPATIAL and non-SPATIAL indexes. The other storage engines support non-SPATIAL indexes, as described in Section 13.1.15, “CREATE INDEX Statement”.

另外,在 MySQL 8.0 中,对空间数据有了更严格的限制,同一列的数据应该有相同的 SRID

参考资料

# MEM_ROOT

MySQL 的内存管理模块,用于统一申请和释放内存,减少在堆中的内存申请操作的次数,以提升性能

typedef struct st_mem_root
{
  USED_MEM *free;                  /* blocks with free memory in it */
  USED_MEM *used;                  /* blocks almost without free memory */
  USED_MEM *pre_alloc;             /* preallocated block */
  /* if block have less memory it will be put in 'used' list */
  size_t min_malloc;
  size_t block_size;               /* initial block size */
  unsigned int block_num;          /* allocated blocks counter */
  /* 
     first free block in queue test counter (if it exceed 
     MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list)
  */
  unsigned int first_block_usage;

  void (*error_handler)(void);
} MEM_ROOT;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

参考资料

# XA

MySQL XA 是基于Open Group 的《Distributed Transaction Processing:The XA Specification》 标准实现的,支持分布式事务,允许多个数据库实例参与一个全局的事务。MySQl XA 从MySQL 5.0 开始引入,仅innodb存储引擎支持MySQL XA事务。

AP是指应用程序。

RM是资源管理器,事务的参与者,通常是数据库,比如MySQL Server。一个分布式事务通常涉及多个资源管理器。

TM是事务管理器,创建分布式事务并协调分布式事务中的各个子事务的执行和状态。子事务是指分布式事务中在RM上执行的具体操作。

两阶段提交 (Two-Phase Commit, 简称2PC) ,是为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。分布式事务通常采用2PC,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作,这里的参与者可以理解为RM,协调者可以理解为TM。

参考资料