mysql中自带的数据库
infomation_schema
简介
在mysql中,把information_schema看做是一个数据库,确切说是信息数据库。其中保存着关于mysql服务器锁维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权等。在information_schema中。它们实际上是视图,而不是基本表,因此你讲无法看到与之相关的任何文件。
本文基于 MySQL 8.0.31 版本讲解。
information_schema 是 MySQL 自带的数据库,它提供了访问数据库元数据
的方式。
元数据,即数据的数据,是指定义数据结构的数据。那么数据库的元数据就是指定义数据库各类对象结构的数据。例如数据库中的数据库名,表名,列名,用户名,版本名以及从SQL语句得到的结果中大部分字符串是元数据。
information_schema数据库
在mysql中吧information_schema看做是一个数据库,确切的说是信息数据库。它保存着关于MySQL服务所维护的所有其他数据信息,
语句
CHARCTER_SETS表
提供了mysql实例可用字符集的信息,SHOW CHARACTER SET;命令从这个表获取结果
mysql> SHOW CHARACTER SET;
mysql> SELECT * FROM CHARACTER_SETS;
SCHEMATA表
提供了 MySQL 实例可用字符集的信息,SHOW CHARACTER SET;
命令从这个表获取结果。
mysql> SHOW CHARACTER SET;
mysql> SELECT * FROM CHARACTER_SETS;
TABLES 表
存储数据库中的表信息(包括试图),包括表属于哪个数据库,表的类型,存储引擎,创建时间等信息。SHOW TABLES FROM xx命令
mysql> SELECT * FROM TABLES;
mysql> SHOW TABLES FROM pointer_mall;
COLUMNS表
存储表中的列信息,包括表有多少列,每个列的类型等。SHOW COLUMNS FROM schemaname.tablename;命令从这个表获取结果。
mysql> SELECT * FROM COLUMNS LIMIT 2,5;
SHOW COLUMNS FROM pointer_mall.account;
STATISTICS表
表索引的信息。SHOW INDEX FROM schemaname.tablename;
命令从这个表获取结果。
mysql> SHOW INDEX FROM pointer_mall.account;
USER_PRIVILEGES 表
用户权限表,内容源自mysql.user授权表。是非标准表
mysql> SELECT * FROM USER_PRIVILEGES;
TABLE_PRIVILEGES 表
表权限表。给出了关于表权限的信息。内容源自mysql.tables_priv授权表。是非标准表
mysql> SELECT * FROM TABLE_PRIVILEGES;
COLUMN_PRIVILEGES 表
列权限表。给出了关于列权限的信息。内容源自 mysql.columns_priv
授权表。是非标准表。
mysql> SELECT * FROM COLUMN_PRIVILEGES;
COLLATIONS 表
提供了关于各字符集的对照信息。SHOW COLLATION;
命令从这个表获取结果。
mysql> SELECT * FROM COLLATIONS;
mysql> SHOW COLLATION;
COLLATION_CHARACTER_SET_APPLICABILITY 表
指明了可用于校对的字符集。相当于 SHOW COLLATION;
命令结果的前两个字段。
mysql> SELECT * FROM COLLATION_CHARACTER_SET_APPLICABILITY;
TABLE_CONSTRAINTS 表
描述了存在约束的表。以及表的约束类型;
mysql> SELECT * FROM TABLE_CONSTRAINTS;
ROUTINES 表
提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES 表不包含自定义函数(UDF)。名为 mysql.proc name 的列指明了对应于 INFORMATION_SCHEMA.ROUTINES 表的 mysql.proc 列。
VIEWS 表
给出了数据库中的试图信息。需要有show views权限,否则无法查看视图信息
mysql> SELECT * FROM VIEWS LIMIT 1\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: sys
TABLE_NAME: version
VIEW_DEFINITION: select '2.1.2' AS `sys_version`,version() AS `mysql_version`
CHECK_OPTION: NONE
IS_UPDATABLE: NO
DEFINER: mysql.sys@localhost
SECURITY_TYPE: INVOKER
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
TRIGGERS 表
提供了关于触发程序的信息。必须有 super
权限才能查看该表。
mysql> SELECT * FROM TRIGGERS LIMIT 1\G
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: sys
TRIGGER_NAME: sys_config_insert_set_user
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: sys
EVENT_OBJECT_TABLE: sys_config
ACTION_ORDER: 1
ACTION_CONDITION: NULL
ACTION_STATEMENT: BEGIN
IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN
SET NEW.set_by = USER();
END IF;
END
ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: 2022-11-03 14:07:50.56
SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
DEFINER: mysql.sys@localhost
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_0900_ai_ci
DATABASE_COLLATION: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
MySQL 8.0 information_schema 改进
重命名的 InnoDB information_schema
旧名称 | 新名称 |
---|---|
INNODB_SYS_COLUMNS | INNODB_COLUMNS |
INNODB_SYS_DATAFILES | INNODB_DATAFILES |
INNODB_SYS_FIELDS | INNODB_FIELDS |
INNODB_SYS_FOREIGN | INNODB_FOREIGN |
INNODB_SYS_FOREIGN_COLS | INNODB_FOREIGN_COLS |
INNODB_SYS_INDEXES | INNODB_INDEXES |
INNODB_SYS_TABLES | INNODB_TABLES |
INNODB_SYS_TABLESPACES | INNODB_TABLESPACES |
INNODB_SYS_TABLESTATS | INNODB_TABLESTATS |
INNODB_SYS_VIRTUAL | INNODB_VIRTUAL |
Performance_schema
简介
自MySQL5.5开始,MySQL新增了一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数
mysql的performance_schema用于监控MySQL在一个较低级别的运行过程中的资源消耗,资源等待等情况。
特点
提供了一种在数据库运行时检查server的内部执行情况的方法。performance_schema数据库中的表使用performance_schema存储引擎。该数据库主要关注数据库运行过程中的性能相关的数据,与information_schema不同,information_schema主要关注server运行过程中的元数据信息。
performance_schema通过监视server的事件来实现监视server内部运行情况, “事件”就是server内部活动中所做的任何事情以及对应的时间消耗,利用这些信息来判断server中的相关资源消耗在了哪里?一般来说,事件可以是函数调用、操作系统的等待、SQL语句执行的阶段(如sql语句执行过程中的parsing 或 sorting阶段)或者整个SQL语句与SQL语句集合。事件的采集可以方便的提供server中的相关存储引擎对磁盘文件、表I/O、表锁等资源的同步调用信息。
performance_schema中的事件与写入二进制日志中的事件(描述数据修改的events)、事件计划调度程序(这是一种存储程序)的事件不同。performance_schema中的事件记录的是server执行某些活动对某些资源的消耗、耗时、这些活动执行的次数等情况。
performance_schema中的事件只记录在本地server的performance_schema中,其下的这些数据表中数据发生变化时不会被写入binlog中,也不会通过复制的机制被复制到其他server中。
当前活跃事件、历史事件和事件摘要相关的表中记录的信息。能提供某个事件的执行次数、使用时长。进而可用于分析某个特定线程、特定对象(如mutex或file)相关联的活动。
PERFORMANCE_SCHEMA存储引擎使用server源代码中的“检测点”来实现事件数据的收集。对于performance_schema实现机制本身的代码没有相关的单独线程来检测,这与其他功能(如复制或事件计划程序)不同
收集的事件数据存储在performance_schema数据库的表中。这些表可以使用SELECT语句查询,也可以使用SQL语句更新performance_schema数据库中的表记录(如动态修改performance_schema的setup_*开头的几个配置表,但要注意:配置表的更改会立即生效,这会影响数据收集)
performance_schema的表中数据不会持久化在磁盘中,而是保存在内存中,一旦服务器重启,这些数据丢失(包括配置表在内的整个performance_schema下的所有数据)
MySQL支持的所有平台中事件监控功能都可用,但不同平台中用于统计事件时间开销的计时器类型可能会有所差异。
入门
在mysql5.7版本中,性能模式是默认开启的,如果想要显式关闭需要修改配置文件,不能直接进行修改,会报错Variable 'performance_schema' is a read only variable。
--查看performance_schema的属性
mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| performance_schema | ON |
+--------------------+-------+
1 row in set (0.01 sec)
--在配置文件中修改performance_schema的属性值,on表示开启,off表示关闭
[mysqld]
performance_schema=ON
--切换数据库
use performance_schema;
--查看当前数据库下的所有表,会看到有很多表存储着相关的信息
show tables;
--可以通过show create table tablename来查看创建表的时候的表结构
mysql> show create table setup_consumers;
+-----------------+---------------------------------
| Table | Create Table
+-----------------+---------------------------------
| setup_consumers | CREATE TABLE `setup_consumers` (
`NAME` varchar(64) NOT NULL,
`ENABLED` enum('YES','NO') NOT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8 |
+-----------------+---------------------------------
1 row in set (0.00 sec)
性能模式是MySQL提供的一种监视数据库活动的工具。它可以提供实时的性能统计信息,包括服务器资源使用情况、执行语句的数量和执行时间、每个线程的状态等。通过分析性能模式,可以发现数据库瓶颈和性能问题的根本原因,以及为优化MySQL性能提供参考。
想要搞明白后续内容要理解俩个概念
instruments:生产者,用于采集mysql中各种各样的操作产生的事件信息,对应配置表中的配置项我们可以称为监控采集配置项。
consumers:消费者,对应的消费者表用来存储来自instruments采集的数据,对应配置表中的配置项我们可以称为消费存储配置项。
分类
performance_schema库下的表可以按照监视不同的纬度就行分组。
--语句事件记录表,这些表记录了语句事件信息,当前语句事件表events_statements_current、历史语句事件表events_statements_history和长语句历史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分)
show tables like '%statement%';
--等待事件记录表,与语句事件类型的相关记录表类似:
show tables like '%wait%';
--阶段事件记录表,记录语句执行的阶段事件的表
show tables like '%stage%';
--事务事件记录表,记录事务相关的事件的表
show tables like '%transaction%';
--监控文件系统层调用的表
show tables like '%file%';
--监视内存使用的表
show tables like '%memory%';
--动态对performance_schema进行配置的配置表
show tables like '%setup%';
共有110个表。这些表根据监测维度不同,我们将其分为:
- 语句事件记录表
mysql> show tables like 'events_statement%';
+----------------------------------------------------+
| Tables_in_performance_schema (events_statement%) |
+----------------------------------------------------+
| events_statements_current | //当前语句事件表
| events_statements_histogram_by_digest | //历史语句事件表
| events_statements_histogram_global |
| 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_program |
| events_statements_summary_by_thread_by_event_name |
| events_statements_summary_by_user_by_event_name |
| events_statements_summary_global_by_event_name |
+----------------------------------------------------+
12 rows in set (0.00 sec)
- 等待时间记录表
mysql> show tables like 'events_wait%';
+-----------------------------------------------+
| Tables_in_performance_schema (events_wait%) |
+-----------------------------------------------+
| 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 |
+-----------------------------------------------+
9 rows in set (0.00 sec)
- 阶段事件记录表
mysql> show tables like 'events_stage%';
+------------------------------------------------+
| Tables_in_performance_schema (events_stage%) |
+------------------------------------------------+
| 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 |
+------------------------------------------------+
8 rows in set (0.00 sec)
- 事务事件记录表
mysql> show tables like 'events_transaction%';
+------------------------------------------------------+
| Tables_in_performance_schema (events_transaction%) |
+------------------------------------------------------+
| events_transactions_current |
| events_transactions_history |
| events_transactions_history_long |
| events_transactions_summary_by_account_by_event_name |
| events_transactions_summary_by_host_by_event_name |
| events_transactions_summary_by_thread_by_event_name |
| events_transactions_summary_by_user_by_event_name |
| events_transactions_summary_global_by_event_name |
+------------------------------------------------------+
8 rows in set (0.00 sec)
- 监控文件系统调用的表
mysql> show tables like '%file%';
+---------------------------------------+
| Tables_in_performance_schema (%file%) |
+---------------------------------------+
| file_instances |
| file_summary_by_event_name |
| file_summary_by_instance |
+---------------------------------------+
3 rows in set (0.00 sec)
- 件事内存使用的表
mysql> show tables like '%memory%';
+-----------------------------------------+
| Tables_in_performance_schema (%memory%) |
+-----------------------------------------+
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
+-----------------------------------------+
5 rows in set (0.00 sec)
- 对performance_schema进行配置的表
mysql> show tables like '%setup%';
+----------------------------------------+
| Tables_in_performance_schema (%setup%) |
+----------------------------------------+
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| setup_threads |
+----------------------------------------+
5 rows in set (0.01 sec)
查询性能表进行分析
--1、哪类的SQL执行最多?
SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--2、哪类SQL的平均响应时间最多?
SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--3、哪类SQL排序记录数最多?
SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--4、哪类SQL扫描记录数最多?
SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--5、哪类SQL使用临时表最多?
SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--6、哪类SQL返回结果集最多?
SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC
--7、哪个表物理IO最多?
SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC
--8、哪个表逻辑IO最多?
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC
--9、哪个索引访问最多?
SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC
--10、哪个索引从来没有用过?
SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> 'mysql' ORDER BY OBJECT_SCHEMA,OBJECT_NAME;
--11、哪个等待事件消耗时间最多?
SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC
--12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息
SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%count(*)%';
--12-2、查看每个阶段的时间消耗
SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553;
--12-3、查看每个阶段的锁等待情况
SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;
查看持有的锁
BEGIN;
select * from user_detail where user_id = 385080931 for update;
select* from performance_schema.data_locks;
COMMIT;
Mysql 运行中事务等待持有锁的事务可以在表 performance_schema.data_lock_waits 中查看
mysql性能工具Performance Schema的介绍与使用示例_mysql performance_schema-CSDN博客
Sys数据库
MySQL的sys数据库是MySQL 5.7中引入的系统管理功能,它增强了MySQL的管理能力,提供更多的系统级别的信息,以便于管理员进行管理和优化。
sys数据库包括几个库:sys、sysaux和performance_schema,其中sys库是最重要的。sys库根据内部的视图,提供有关MySQL数据库的所有信息。这些视图不同于常规MySQL用户定义的视图,因为它们在MySQL内核中完全集成,并基于内部表格而不是基于其他表格。
可以通过如下命令打开MySQL的sys数据库:
USE sys;
sys数据库中有很多有用的视图,例如:
SELECT * FROM sys.memory_global_by_current_bytes;
这个命令可以检查当前MySQL服务器上已使用的全局内存量。它显示了一个带有不同颜色的内存图,表示当前已分配的内存情况。
另一个有用的视图是:sys.innodb_tablespaces_encryption。这个视图用于检查使用了加密表空间的InnoDB表的数量:
SELECT COUNT(*) as encryption_tablespaces FROM sys.innodb_tablespaces_encryption;
除了这些视图,sys数据库还提供了各种查询和函数,以便于管理员进行管理和维护。例如:
SELECT SYS_CONTEXT('userenv', 'hostname') as db_hostname;
这个命令可以检查当前MySQL服务器的主机名。
总之,sys数据库是MySQL 5.7中引入的很有用的系统管理库。它提供了大量有关MySQL服务器的信息,以帮助管理员进行优化和维护。
Sys库所有数据源来自performance_schema。目标是把performance_schema的复杂度降低,让DBA能更好阅读这个库里的内容。让DBA更快了解DB的运行情况。Sys开头的是库里的配置表,sys_config用于sys_schema库的配置。
sys有俩种库
- 字母开头: 适合人阅读,显示是格式化的数
- x$开头 : 适合工具采集数据,原始类数据
mysql库
mysql库是数据库的核心,它存储了MySQL的用户账户和权限信息,一些存储过程,事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
权限系统表
因为权限管理是DBA的职责,所以对于这个不分的表,我们大概了解一下即可。在mysql系统库中,mysql访问权限系统表,放在mysql库中,主要包含如下几个表。
- user:包含用户账户、全局权限和其他非权限列表(安全配置字段和资源控制字段)。
- db:数据库级别的权限表。该表中记录的权限信息代表用户是否可以使用这些权限来访问被授予访问的数据库下的所有对象(表或存储程序)。
- tables_priv:表级别的权限表。
- columns_priv:字段级别的权限表。
- procs_priv:存储过程和函数权限表。
- proxies_priv:代理用户权限表。
提示:要更改权限表的内容,应该使用账号管理语句(如:CREATE USER、GRANT、REVOKE 等)来间接修改,不建议直接使用 DML 语句修改权限表。
统计信息表
innodb_stats_persistent
持久化统计功能是通过将内存中的统计数据存储到磁盘中,使其在数据库重启时可以快速重新读入这些统计信息而不用重新执行统计,从而使得查询优化器可以利用这些持久化的统计信息准确地选择执行计划(如果没有这些持久化的统计信息,那么数据库重启之后内存中的统计信息将会丢失,下一次访问到某库某表时,需要重新计算统计信息,并且重新计算可能会因为估算值的差异导致查询计划发生变更,从而导致查询性能发生变化)。
如何启用统计信息的持久化功能呢?当innodb_stats_persistent = ON 时全局的开启统计信息的持久化功能,默认是开启的.
show variables like 'innodb_stats_persistent';
如果要单独关闭某个表的持久化统计功能,则可以通过 ALTER TABLE tbl_name STATS_ PERSISTENT = 0 语句来修改。
innodb_table_stats
innodb_table_stats 表提供查询与表数据相关的统计信息。
select * from innodb_table_stats where table_name = 'order_exp'G
1.
database_name:数据库名称。
table_name:表名、分区名或子分区名。
last_update:表示 InnoDB 上次更新统计信息行的时间。
n_rows:表中的估算数据记录行数。
clustered_index_size:主键索引的大小,以页为单位的估算数值。
sum_of_other_index_sizes:其他(非主键)索引的总大小,以页为单位的估算数值。
其中的估算数据记录行数,页为单位的估算数值等等.
innodb_index_stats
innodb_index_stats 表提供查询与索引相关的统计信息。
select * from innodb_index_stats where table_name = 'order_exp';
表字段含义如下。
database_name:数据库名称。
table_name:表名、分区表名、子分区表名。
index_name:索引名称。
last_update:表示 InnoDB 上次更新统计信息行的时间。
stat_name:统计信息名称,其对应的统计信息值保存在 stat_value 字段中。
stat_value:保存统计信息名称 stat_name 字段对应的统计信息值。
sample_size:stat_value 字段中提供的统计信息估计值的采样页数。
stat_description:统计信息名称 stat_name 字段中指定的统计信息的说明。从表的查询数据中可以看到:
stat_name 字段一共有如下几个统计值。
size:当 stat_name 字段为 size 值时,stat_value 字段值表示索引中的总页数量。
n_leaf_pages:当 stat_name 字段为 n_leaf_pages 值时,stat_value 字段值表示索引叶子页的数量。
n_diff_pfxNN:NN 代表数字(例如 01、02 等)。当 stat_name 字段为n_diff_pfxNN 值时,stat_value 字段值表示索引的 first column(即索引的最前索引列,从索引定义顺序的第一个列开始)列的唯一值数量。例如:当 NN 为 01 时,stat_value 字段值就表示索引的第一个列的唯一值数量;当 NN 为 02 时,stat_value 字段值就表示索引的第一个和第二个列组合的唯一值数量,依此类推。此外,在 stat_name = n_diff_pfxNN 的情况下,stat_description 字段显示一个以逗号分隔的计算索引统计信息字段的列表。
从 index_name 字段值为 PRIMARY 数据行的 stat_description 字段的描述信息“id”中可以看出,主键索引的统计信息只包括创建主键索引时显式指定的列。
从index_name 字段值为u_idx_day_status 数据行的stat_description 字段的描述信息“insert_time,order_status,expire_time”中可以看出,唯一索引的统计信息只包括创建唯一索引时显式指定的列。
从index_name 字段值为idx_order_no 数据行的stat_description 字段的描述信息“order_no,id”中可以看出,普通索引(非唯一的辅助索引)的统计信息包括了显式定义的列和主键列。
注意,上述的描述中出现的诸如叶子页,索引的最前索引列等等,以及这个统计表的具体作用,后续单独拿出来给大家详解。
日志记录
MySQL 的日志系统包含:普通查询日志、慢查询日志、错误日志(记录服务器启动时、运行中、停止时的错误信息)、二进制日志(记录服务器运行过程中数据变更的逻辑日志)、中继日志(记录从库 I/O 线程从主库获取的主库数据变更日志)、DDL 日志(记录 DDL 语句执行时的元数据变更信息。在 MySQL 5.7 中只支持写入文件中,在 MySQL 8.0 中支持写入 innodb_ddl_log 表中。在 MySQL5.7 中,只有普通查询日志、慢查询日志支持写入表中(也支持写入文件中),可以通过 log_output=TABLE 设置保存到 mysql.general_log 表和 mysql.slow_log 表中, 其他日志类型在 MySQL 5.7 中只支持写入文件中。
general_log
general_log 表提供查询普通 SQL 语句的执行记录信息,用于查看客户端到底在服务器上执行了什么 SQL 语句。默认不开启
登录后复制
show variables like 'general_log';
slow_log
slow_log 表提供查询执行时间超过 long_query_time 设置值的 SQL 语句、未使用索引的语句(需要开启参数 log_queries_not_using_indexes=ON)或者管理语句(需要开启参数 log_slow_admin_statements=ON)。
更详细的信息,我们在 SQL 优化的部分再了解。
复制信息表
复制信息表在从库复制主库的数据期间,用于保存从主库转发到从库的binlog(二进制日志)事件,记录有关 relay log(中继日志)当前状态和位置的信息。我们大致了解即可。
master.info 文件或者 mysql.slave_master_info 表:用于保存从库的 I/O 线程连接主库的连接状态、账号、IP 地址、端口、密码,以及 I/O 线程当前读取主库binlog 的文件和位置信息(称为 I/O 线程信息日志)。在默认情况下,I/O 线程的连接信息和状态保存在 master.info 文件中(默认位置在 datadir 下,可以使用master_info_file 参数指定 master.info 文件路径。注:在 MySQL 5.7.x 较新的版本以及 8.0.x 版本中该参数已经被移除)。如果需要保存在 mysql.slave_master_info 表中,则需要在服务器启动之前设置 master_info_repository=TABLE。
relay_log.info 文件或者 mysql.slave_relay_log_info 表:当从库的 I/O 线程从主库获取到最新的 binlog 事件信息后会先写入从库本地的 relay log 中,然后SQL 线程再去读取 relay log 解析并重放。relay_log.info 文件或者mysql.slave_relay_log_info 表就是用于记录最新的 relay log 的文件和位置,以及SQL 线程当前重放的事件对应的主库 binlog 的文件和位置信息的(SQL 线程位置被称为 SQL 线程信息日志)。在默认情况下,relay log 的位置信息和 SQL 线程的位置信息保存在 relay-log.info 文件中(默认位置在 datadir 下,可以使用relay_log_info_file 选项指定 relay-log.info 文件路径)。如果需要保存在mysql.slave_relay_log_info 表中,则需要在服务器启动之前设置relay_log_info_repository=TABLE。