一、系统和状态变量(System and status variables)
现在Performance Schema表中可以获取到系统和状态变量。它们会被优先存储于INFORMATION_SCHEMA表中。它们的值会影响到 SHOW VARIABLES 和 SHOW STATUS的操作。show_compatibility_56(默认是OFF)这个系统参数的值会影响到输出系统和状态变量的那些语句和表,也会影响到这些语句和表所需的权限。
二、sys schema
MySQL 5.7 版本新增了sys 数据库,该库通过视图的形式把information_schema 和performance_schema结合起来,查询出更加令人容易理解的数据,帮助DBA快速获取数据库系统的各种纬度的元数据信息,帮助DBA和开发快速定位性能瓶颈。详细的信息请参考《官方文档》,这里给两个例子能直观的了解sys 功能的强大。
mysql> select * from sys.schema_table_statistics limit 0,1\G; *************************** 1. row *************************** table_schema: precision_db table_name: pre_strategy total_latency: 8.27 s rows_fetched: 9405400 fetch_latency: 8.27 s rows_inserted: 0 insert_latency: 0 ps rows_updated: 0 update_latency: 0 ps rows_deleted: 0 delete_latency: 0 ps io_read_requests: 36 io_read: 433.63 KiB io_read_latency: 11.88 ms io_write_requests: 0 io_write: 0 bytes io_write_latency: 0 ps io_misc_requests: 15 io_misc_latency: 7.25 ms 1 row in set (0.11 sec) mysql> SELECT * FROM sys.schema_unused_indexes; +---------------+--------------------+-----------------------------+ | object_schema | object_name | index_name | +---------------+--------------------+-----------------------------+ | precision_db | pre_real_time_data | Idx_timestamp | | precision_db | pre_real_time_data | Idx_gateway | +---------------+--------------------+-----------------------------+
三、条件处理(Condition handling)
MySQL现在支持堆叠的诊断区。当诊断区栈被push进来,之前第一个诊断区变成了第二个,新的诊断区(被push的那个)会被复制到第一的位置。在一个条件处理程序中,被执行的语句修改了新的当前诊断区域,但是可以使用GET STACKED DIAGNOSTICS 方法来检查栈中的诊断区域,以获取关于导致处理程序激活的条件的信息,它独立于处理程序本身的当前条件。(以前,只有一个诊断区域。为了检查处理程序内的被处理程序激活的条件,必须在执行任何可能更改它的语句之前,检查该诊断区域。)官方文档:GET DIAGNOSTICS Syntax The MySQL Diagnostics Area
四、优化程序(Optimizer)
EXPLAIN能被用来获取在命名连接中正在执行的可解释语句的执行计划。
EXPLAIN [options] FOR CONNECTION connection_id;
该功能可以在一个会话里面查看另外一个会话中正在执行的长查询。
mysql> show processlist; +----+------+-------------------+--------------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-------------------+--------------+---------+------+----------+------------------+ | 3 | root | localhost:56525 | NULL | Sleep | 6 | | NULL | | 4 | root | localhost:56526 | NULL | Sleep | 3058 | | NULL | | 10 | fate | 192.168.1.1:49291 | precision_db | Sleep | 25 | | NULL | | 11 | root | localhost:59279 | NULL | Query | 0 | starting | show processlist | +----+------+-------------------+--------------+---------+------+----------+------------------+ mysql> explain FOR CONNECTION 10;
可以在单独的SQL语句中向优化器提供提示,这样可以更好地控制语句执行计划,而不是使用optizer_switch系统变量来实现。这些语句也可以结合 EXPLAIN使用。
SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1 FROM t3 WHERE f1 > 30 AND f1 < 33; SELECT /*+ BKA(t1) NO_BKA(t2) */ * FROM t1 INNER JOIN t2 WHERE ...; SELECT /*+ NO_ICP(t1, t2) */ * FROM t1 INNER JOIN t2 WHERE ...; SELECT /*+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) */ * FROM t1 ...; EXPLAIN SELECT /*+ NO_ICP(t1) */ * FROM t1 WHERE ...;
优化器级别的hint分四种类型:
Global: 会影响所有语句
Query block: 只会影响语句中的特定查询
Table-level: 影响特定表的查询
Index-level: 影响表中的特定索引
当前可用的优化级别提示:提示名称 描述 可用范围 BKA, NO_BKA Affects Batched Key Access join processing Query block, table BNL, NO_BNL Affects Block Nested-Loop join processing Query block, table MAX_EXECUTION_TIME Limits statement execution time Global MRR, NO_MRR Affects Multi-Range Read optimization Table, index NO_ICP Affects Index Condition Pushdown optimization Table, index NO_RANGE_OPTIMIZATION Affects range optimization Table, index QB_NAME Assigns name to query block Query block SEMIJOIN, NO_SEMIJOIN Affects semi-join strategies Query block SUBQUERY Affects materialization, IN-to-EXISTS subquery stratgies Query block
五、触发器升级(Triggers)
以前,一张表只能包含 (INSERT, UPDATE, DELETE) 中的一种事件, (BEFORE, AFTER)中的一种操作。在MySQL5.7版本以后,不再有这个限制。
六、日志升级(Logging)
以前,在Unix或者是Unix衍生版的系统上,MySQL对发送错误日志到syslog的支持,是通过mysqld_safe捕获服务器来进行错误输出,并发送到syslog实现的。现在,MySQL服务器支持原生的syslog,也支持Windows系统。
现在,MySQL客户端有了--syslog选项,它可以将交互式语句发送到系统syslog工具