基于 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

参考资料