一、MySQL慢查询Log:
说明:慢查询Log开启后,会将超出指定时间的查询记录在Log中,可以查看并分析Log找出缓慢的查询事件。
1.开启慢查询Log(vi /etc/my.cnf):
log_output='FILE,TABLE' ? ?#将log输出到文件和mysql.slow_log表中,可以只指定一种方式
slow_query_log=ON ? ? ? ? ?#开启慢查询log
long_query_time=0.100 ? ? ?#指定超过此时间的查询记入log,单位秒,用小数表示毫秒
2.查看慢查询Log:
(1)FILE方式(mysqldumpslow --help查询更多命令参数):
mysql> mysqldumpslow /var/lib/mysql/localhost-slow.log
(2)TABLE方式:
mysql> select * from mysql.slow_log;
二、创建索引:
1.索引分类:
(1)以功能分:
主键索引:某表只有一列主键索引/列的值不允许null
唯一索引:索引列的值唯一/值允许null
普通索引:无约束,只为提高查询效率
组合索引:在多列上创建索引,查询时条件列顺序必须与创建索引时列顺序一致(最左优先)
全文索引:搜索含某个关键字的列,MySQL5.6.24-只支持MyISAM、MySQL5.6.24及+支持MyISAM/InnoDB引擎
(2)以数据结构分:
B+树/Hash/空间数据索引(R-Tree)/全文索引
(3)以存储分:
聚簇索引(查效率高/增删改效率低)、非聚簇索引(查效率低/增删改效率高)
2.索引使用:
(1)创建唯一索引:
mysql> create unique index 索引别名 on 表名(列名(长度值))
(2)创建普通索引:
mysql> create index 索引别名 on 表名(列名(长度值))
(3)创建组合索引:
mysql> create index 索引别名 on 表名 (列名1, 列名2)
(4)全文索引:
创建:
mysql> create fulltext index 索引别名 on 表名 (列名(长度值))
查询:
mysql> select * from 表名 where match(列名) against ('匹配值')
三、MySQL Explain使用:
说明:
Explain用于查看SQL语句执行计划,比如是否使用了索引、排序情况等。
1.Explain使用:
(1)使用explain查看优化信息:
格式:
explain 查询语句;
例:
mysql> explain select * from 表名 where 列名 = '值';
(2)使用explain+show warnings查看更多扩展信息:
格式:
explain 查询语句;
show warnings;
例:
mysql> explain select * from 表名 where 列名 = '值';
mysql> show warnings;
2.输出列表说明:
(1)id: 标识
(2)select_type(查询类型,值如下):?
SIMPLE:简单查询,未使用union或子查询
PRIMARY:最外层的查询
UNION:union中第二个及后面的select被标记为union。如果union被from子句中子查询包含,第一个select会标记成derived
DEPENDENT UNION:union中第二个或后面查询依赖了外面的查询时
UNION RESULT:union的结果
SUBQUERY:子查询第一个select
DEPENDENT SUBQUERY:子查询第一个select依赖了外面的查询时
DERIVED:包含在from子句子查询中的select,会将结果放在派生表中
DEPENDENT DERIVED:派生表依赖了其他的表
MATERIALIZED:物化子查询
UNCACHEABLE SUBQUERY:子查询,结果无法缓存
UNCACHEABLE UNION:union属于uncacheable subquery第二个或后面的查询
(3)table: ?表名
(4)partitions: ?查询结果所属分区,未分区为null
(5)type(连接类型,值如下,性能从上往下变差): ?
system和const:使用主键/唯一索引等值查询,如where id=1。system属于const的特例(表只有一行)
eq_ref:多表关联查询使用主键/唯一索引作为查询条件,如select * from 表1,表2 where 表1.主键或唯一索引列=表2.主键或唯一索引列
ref:单表查询/多表关联查询使用普通/组合索引作为查询条件,如select * from 表1,表2 where 表1.普通索引列=表2.普通索引列
fulltext:使用全文索引作为查询条件
ref_or_null:类似ref,额外查询含null的记录,如where name=xxx or name is null
index_merge:查询中使用了多个索引且索引合并优化
unique_subquery:类似eq_ref,使用in且子查询是主键/唯一索引,如value in (select 主键或唯一索引列 from 表名 where 条件)
index_subquery:类似unique_subquery,子查询是普通索引,如value in (select 普通索引列 from 表名 where 条件)
range:使用了between、like、in()、>、>=、<、<=、<=>等范围查询条件,例select * from 表名 where 索引列 > 值
index:查询时遍历全索引
All:查询时遍历全表
(6)possible_keys和key: ?索引别名,主键索引别名为PRIMARY
(7)key_len: ?索引字段长度
(8)ref: ?被引用的索引列,如const
(9)rows: ?估算遍历行数,数值越小性能越好
(10)filtered: ?所有数据中符合查询条件的百分占比
(11)Extra(附加信息):?
const row not found:查询时表数据为空
Deleting all rows:使用了优化的delete语句
Distinct:找到第一行匹配时,停止为当前行组合搜索更多行
FirstMatch:使用半连接的FirstMatch策略
Full scan on NULL key:子查询优化方式,无法通过索引访问null时
Impossible HAVING:having子句始终无法匹配任何行
Impossible WHERE:where始终无法匹配任何行
LooseScan:使用半连接的LooseScan策略
No matching min/max row:min(...)与max(...)没有匹配行
no matching row in const table:表中没有匹配唯一索引条件的行
No matching rows after partition pruning:分区修剪后,delete/update时没有匹配的行
No tables used:select后面没有from子句或有from dual子句时
Not exists:找到符合left join的行后,不会再去组合中检查此表中的更多行
Plan isn't ready yet:使用了explain for connection,还未给执行的语句创建执行计划时
Range checked for each record:检查每个记录的范围
Recursive:出现递归查询
Scanned N databases:处理information_schema表查询时,扫描了N个目录
Select tables optimized away:返回只有1行且需要读取指定列时,如explain select min(列名) from 表名
Skip_open_table:适用information_schema表查询的文件打开优化,不用打开表文件,扫描数据字典获得
Open_frm_only:适用information_schema表查询的文件打开优化,只读取数据字典获得
Open_full_table:适用information_schema表查询的文件打开优化,(未优化)从数据字典+表文件中获取
Start temporary/End temporary:临时表使用Duplicate Weedout策略
unique row not found:查询条件为唯一/主键索引时没有匹配的行
Using filesort:含order by且无法利用索引排序
Using index:只查询单个索引列时,如explain select 索引列 from 表名
Using index for group-by:类似Using index,且带有group by 索引列名子句(或distinct)
Using index condition:先按条件过滤索引,再按where子句的其他条件过滤行(开/关索引条件下推:set optimizer_switch='index_condition_pushdown=on/off')
Using index for skip scan:使用了Skip Scan
Using join buffer:使用了Block NestedLoop或Batched Key Access算法提高join性能
Using MRR:使用了Multi-Range Read策略
Using sort_union/Using union/Using intersect:表明索引扫描如何合并为index_merge的连接类型
Using temporary:查询含group by或order by且需要创建临时表时,如explain select 非索引列 from 表 group by 非索引列
Using where:不能仅通过索引就获取所有数据时,如explain select * from 表名 where 索引列范围表达式
Zero limit:查询时有limit 0子句
3.评估查找次数(mysql索引块为1024字节,数据指针为4字节):
公式:查找次数 = log(表总行数) / log(索引块长度 / 3*2 / (索引长度 + 数据指针长度)) + 1
四、MySQL性能分析:
1.show profile方式:
(1)查看是否支持show profile(YES支持,NO不支持):
mysql> select @@have_profiling;
(2)查看是否开启show profile(0未开,1开启):
mysql> select @@profiling;
(3)开启/关闭show profile:
mysql> set profiling = 1;
mysql> set profiling = 0;
(4)修改性能分析时显示的条数:
mysql> set profiling_history_size = 50;
(5)查看最近执行的SQL语句性能:
mysql> show profile; ? ? ? ? ? ? ? ? ? ? ? #查看最近一条sql执行详情
mysql> show profiles; ? ? ? ? ? ? ? ? ? ? ?#查看sql执行情况列表
mysql> show profile cpu,swaps; ? ? ? ? ? ? #增加指定列的详情
mysql> show profile for query 第几条; ? ? ?#查看某一条sql执行情况
mysql> show profile cpu for query 第几条;
2.information_schema.profiling方式(需要开启show profile):
(1)开启show profile:
mysql> set profiling = 1;
(2)查看最近执行的SQL语句性能:
mysql> select * from information_schema.profiling order by seq;
(3)输出列表说明:
QUERY_ID:sql语句标识
SEQ:相同QUERY_ID行的显示顺序
STATE:分析状态
DURATION:在此状态下持续时间,单位为秒
CPU_USER/CPU_SYSTEM:CPU使用情况
CONTEXT_VOLUNTARY/CONTEXT_INVOLUNTARY:自愿上下文/非自愿上下文转换数量
BLOCK_OPS_IN/BLOCK_OPS_OUT:块输入/块输出操作的数量
MESSAGES_SENT/MESSAGES_RECEIVED:发送/接收的消息
PAGE_FAULTS_MAJOR/PAGE_FAULTS_MINOR:主要/次要的页错误信息
SWAPS:发生SWAP的数量
SOURCE_FUNCTION/SOURCE_FILE/SOURCE_LINE:当前状态执行源码所在的位置
3.performance_schema方式(推荐):
(1)查看是否开启performance_schema(默认开启):
mysql> show variables like 'performance_schema';
mysql> select * from performance_schema.setup_actors;
(2)监控root用户执行的SQL语句(默认所有用户):
mysql> update performance_schema.setup_actors set enabled='NO',history='NO' where host='%' and user='%';
mysql> insert into performance_schema.setup_actors(host,user,role,enabled,history) values('localhost','root','%','YES','YES');
(3)开启指定监控项:
mysql> update performance_schema.setup_instruments set enabled='YES',timed='YES' where name like '%statement/%' or name like '%stage/%';
mysql> update performance_schema.setup_instruments set enabled='YES' where name like '%events_statements_%' or name like '%events_stages_%';
(4)分析SQL语句的性能:
mysql> select EVENT_ID,truncate(TIMER_WAIT/1000000000000,6) as TIME,SQL_TEXT from performance_schema.events_statements_history_long; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#查询耗时的EVENT_ID,一般需要where过滤,在此步之前执行过业务SQL语句才有数据
mysql> select EVENT_NAME,truncate(TIMER_WAIT/1000000000000,6) as TIME from performance_schema.events_stages_history_long where NESTING_EVENT_ID=上面查的EVENT_ID; ? #查看性能分析
五、MySQL Optimizer Trace使用:
说明:
Optimizer Trace是跟踪分析功能,跟踪结果存在information_schema.optimizer_trace表中,支持分析select、insert、update、delete、set、explain、replace、declare等SQL语句。
1.开启/关闭Optimizer Trace+JSON格式存储:
(1)开启:
mysql> set optimizer_trace="enabled=on",end_markers_in_json=on;
mysql> set global optimizer_trace="enabled=on",end_markers_in_json=on; ? #全局开启,同上
(2)关闭:
mysql> set optimizer_trace="enabled=off";
2.设置Optimizer Trace记录的SQL数量(默认记录最近一条SQL):
格式:
set optimizer_trace_offset=第1条数据偏移量(默认-1),optimizer_trace_limit=显示数量(默认1);
例(记录最近20条SQL):
mysql> set optimizer_trace_offset=-20,optimizer_trace_limit=20;
3.查询Optimizer Trace记录(此处显示1条):
mysql> select * from mydb.t_user as u where u.id=1; ? ? ? ? ? ? ? ? ?#执行测试SQL语句
mysql> select * from information_schema.optimizer_trace limit 1 \G; ?#查询Optimizer Trace记录
输出列表说明:
*************************** 1. row ***************************
? ? ? ? ? ? ? ? ? ? ? ? ? ? QUERY: select * from mydb.t_user as u,mydb.t_adress as a where u.id=1 or a.id=1 ?#SQL语句原字符串
? ? ? ? ? ? ? ? ? ? ? ? ? ? TRACE: { ?#SQL语句跟踪信息
? "steps": [
? ? {
? ? ? "join_preparation": { ?#准备阶段
? ? ? ? "select#": 1,
? ? ? ? "steps": [ ? ? ? ? ? #格式化SQL语句
? ? ? ? ? {
? ? ? ? ? ? "expanded_query": "/* select#1 */ select `mydb`.`u`.`id` AS `id`,`mydb`.`u`.`name` AS `name`,`mydb`.`u`.`job` AS `job`,`mydb`.`u`.`aid` AS `aid`,`mydb`.`a`.`id` AS `id`,`mydb`.`a`.`adress` AS `adress` from `mydb`.`t_user` `u` join `mydb`.`t_adress` `a` where ((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))"
? ? ? ? ? }
? ? ? ? ] /* steps */
? ? ? } /* join_preparation */
? ? },
? ? {
? ? ? "join_optimization": { #优化阶段
? ? ? ? "select#": 1,
? ? ? ? "steps": [
? ? ? ? ? {
? ? ? ? ? ? "condition_processing": { ? #待优化对象类型,如where或having
? ? ? ? ? ? ? "condition": "WHERE",
? ? ? ? ? ? ? "original_condition": "((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))", ?#跟在where后面的条件表达式
? ? ? ? ? ? ? "steps": [ #三步条件句转换
? ? ? ? ? ? ? ? { ? ? ? ?#1.等值条件转换
? ? ? ? ? ? ? ? ? "transformation": "equality_propagation", ? ? ?#等值条件类型
? ? ? ? ? ? ? ? ? "resulting_condition": "(multiple equal(1, `mydb`.`u`.`id`) or multiple equal(1, `mydb`.`a`.`id`))" #转换后结果
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? { ? ? ? ?#2.常量条件转换
? ? ? ? ? ? ? ? ? "transformation": "constant_propagation", ? ? ?#常量条件类型
? ? ? ? ? ? ? ? ? "resulting_condition": "(multiple equal(1, `mydb`.`u`.`id`) or multiple equal(1, `mydb`.`a`.`id`))" #转换后结果
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? { ? ? ? ?#3.无效条件移除转换
? ? ? ? ? ? ? ? ? "transformation": "trivial_condition_removal", #无效条件类型
? ? ? ? ? ? ? ? ? "resulting_condition": "(multiple equal(1, `mydb`.`u`.`id`) or multiple equal(1, `mydb`.`a`.`id`))" #转换后结果
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ] /* steps */
? ? ? ? ? ? } /* condition_processing */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "substitute_generated_columns": { #替换虚拟生成列
? ? ? ? ? ? } /* substitute_generated_columns */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "table_dependencies": [ #表之间依赖
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_user` `u`", #数据库名.表名、别名
? ? ? ? ? ? ? ? "row_may_be_null": false, ? ? ? #表数据是否可以为null
? ? ? ? ? ? ? ? "map_bit": 0, ? ? ? ? ? ? ? ? ? #表映射编号,从0开始
? ? ? ? ? ? ? ? "depends_on_map_bits": [ ? ? ? ?#依赖映射表
? ? ? ? ? ? ? ? ] /* depends_on_map_bits */
? ? ? ? ? ? ? },
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_adress` `a`",
? ? ? ? ? ? ? ? "row_may_be_null": false,
? ? ? ? ? ? ? ? "map_bit": 1,
? ? ? ? ? ? ? ? "depends_on_map_bits": [
? ? ? ? ? ? ? ? ] /* depends_on_map_bits */
? ? ? ? ? ? ? }
? ? ? ? ? ? ] /* table_dependencies */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "ref_optimizer_key_uses": [ #ref类型的索引信息列表,含table、field等字段
? ? ? ? ? ? ] /* ref_optimizer_key_uses */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "rows_estimation": [ ?#估算扫描行数
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_user` `u`", ?#数据库名.表名、别名
? ? ? ? ? ? ? ? "range_analysis": {
? ? ? ? ? ? ? ? ? "table_scan": {
? ? ? ? ? ? ? ? ? ? "rows": 3, ? ? ? ? ? ? ? ? ? #扫描行数
? ? ? ? ? ? ? ? ? ? "cost": 2.65 ? ? ? ? ? ? ? ? #代价
? ? ? ? ? ? ? ? ? } /* table_scan */,
? ? ? ? ? ? ? ? ? "potential_range_indexes": [ ? #列出索引可用与不可用信息
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? "index": "PRIMARY", ? ?#主键索引
? ? ? ? ? ? ? ? ? ? ? "usable": true, ? ? ? ?#可用
? ? ? ? ? ? ? ? ? ? ? "key_parts": [ ? #索引列
? ? ? ? ? ? ? ? ? ? ? ? "id"
? ? ? ? ? ? ? ? ? ? ? ] /* key_parts */
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? "index": "un", ? ?#普通索引
? ? ? ? ? ? ? ? ? ? ? "usable": false, ?#不可用
? ? ? ? ? ? ? ? ? ? ? "cause": "not_applicable" #不可用的原因
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? "index": "j", ? ? #普通索引
? ? ? ? ? ? ? ? ? ? ? "usable": false, ?#不可用
? ? ? ? ? ? ? ? ? ? ? "cause": "not_applicable" #不可用的原因
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ] /* potential_range_indexes */,
? ? ? ? ? ? ? ? ? "setup_range_conditions": [ #下推条件,范围查询
? ? ? ? ? ? ? ? ? ] /* setup_range_conditions */,
? ? ? ? ? ? ? ? ? "group_index_range": { ?#是否使用group by或distinct,是时显示可用的索引信息,以下为未使用情况
? ? ? ? ? ? ? ? ? ? "chosen": false,
? ? ? ? ? ? ? ? ? ? "cause": "not_single_table"
? ? ? ? ? ? ? ? ? } /* group_index_range */,
? ? ? ? ? ? ? ? ? "skip_scan_range": { #是否使用了skip scan
? ? ? ? ? ? ? ? ? ? "chosen": false,
? ? ? ? ? ? ? ? ? ? "cause": "not_single_table"
? ? ? ? ? ? ? ? ? } /* skip_scan_range */
? ? ? ? ? ? ? ? ? "analyzing_range_alternatives": {...} #分析涉及的索引使用方法与代价
? ? ? ? ? ? ? ? ? "chosen_range_access_summary": {...} ?#在summary阶段汇总analy...阶段的中间结果,再确认最后的方案
? ? ? ? ? ? ? ? } /* range_analysis */
? ? ? ? ? ? ? },
? ? ? ? ? ? ? ... ? #省略其他
? ? ? ? ? ? ] /* rows_estimation */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "considered_execution_plans": [ #对比可行计划的开销,选择最优执行计划
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "plan_prefix": [ ? ? ? ? ? ? ? ?#前置执行计划
? ? ? ? ? ? ? ? ] /* plan_prefix */,
? ? ? ? ? ? ? ? "table": "`mydb`.`t_user` `u`", #数据库名.表名、别名
? ? ? ? ? ? ? ? "best_access_path": { #选择最优的访问路径
? ? ? ? ? ? ? ? ? "considered_access_paths": [ ?#当前访问路径
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? "rows_to_scan": 3, ? ? ? #扫描行数
? ? ? ? ? ? ? ? ? ? ? "filtering_effect": [
? ? ? ? ? ? ? ? ? ? ? ] /* filtering_effect */,
? ? ? ? ? ? ? ? ? ? ? "final_filtering_effect": 1,
? ? ? ? ? ? ? ? ? ? ? "access_type": "scan", ? ?#连接类型,类似explain.type
? ? ? ? ? ? ? ? ? ? ? "resulting_rows": 3, ? ? ?#行数
? ? ? ? ? ? ? ? ? ? ? "cost": 0.55, ? ? ? ? ? ? #开销
? ? ? ? ? ? ? ? ? ? ? "chosen": true ? ? ? ? ? ?#是否选择当前路径,此处选择了当前路径
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ] /* considered_access_paths */
? ? ? ? ? ? ? ? } /* best_access_path */,
? ? ? ? ? ? ? ? "condition_filtering_pct": 100, #所有数据中符合查询条件的百分占比,类似explain.filtered
? ? ? ? ? ? ? ? "rows_for_plan": 3, ? ? ? ? ? ? #执行计划扫描总行数
? ? ? ? ? ? ? ? "cost_for_plan": 0.55, ? ? ? ? ?#执行计划代价
? ? ? ? ? ? ? ? "rest_of_plan": [
? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "plan_prefix": [
? ? ? ? ? ? ? ? ? ? ? "`mydb`.`t_user` `u`"
? ? ? ? ? ? ? ? ? ? ] /* plan_prefix */,
? ? ? ? ? ? ? ? ? ? "table": "`mydb`.`t_adress` `a`",
? ? ? ? ? ? ? ? ? ? "best_access_path": {
? ? ? ? ? ? ? ? ? ? ? "considered_access_paths": [
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? "rows_to_scan": 3,
? ? ? ? ? ? ? ? ? ? ? ? ? "filtering_effect": [
? ? ? ? ? ? ? ? ? ? ? ? ? ] /* filtering_effect */,
? ? ? ? ? ? ? ? ? ? ? ? ? "final_filtering_effect": 1,
? ? ? ? ? ? ? ? ? ? ? ? ? "access_type": "scan",
? ? ? ? ? ? ? ? ? ? ? ? ? "using_join_cache": true,
? ? ? ? ? ? ? ? ? ? ? ? ? "buffers_needed": 1,
? ? ? ? ? ? ? ? ? ? ? ? ? "resulting_rows": 3,
? ? ? ? ? ? ? ? ? ? ? ? ? "cost": 1.1559,
? ? ? ? ? ? ? ? ? ? ? ? ? "chosen": true
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ] /* considered_access_paths */
? ? ? ? ? ? ? ? ? ? } /* best_access_path */,
? ? ? ? ? ? ? ? ? ? "condition_filtering_pct": 100,
? ? ? ? ? ? ? ? ? ? "rows_for_plan": 9,
? ? ? ? ? ? ? ? ? ? "cost_for_plan": 1.7059,
? ? ? ? ? ? ? ? ? ? "chosen": true ? ? ? ? ? ?#是否选择当前执行计划
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ] /* rest_of_plan */
? ? ? ? ? ? ? },
? ? ? ? ? ? ? ... ? #省略其他
? ? ? ? ? ? ] /* considered_execution_plans */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "attaching_conditions_to_tables": { ?#基于considered_execution_plans执行计划改造原where语句,增加附加条件
? ? ? ? ? ? ? "original_condition": "((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))", ?#原始where后面表达式
? ? ? ? ? ? ? "attached_conditions_computation": [ ? ?#使用启发式算法计算索引,如连接类型为ref,且能使用组合索引时用range替换ref。
? ? ? ? ? ? ? ] /* attached_conditions_computation */,
? ? ? ? ? ? ? "attached_conditions_summary": [ ?#附加情况汇总
? ? ? ? ? ? ? ? ? ..., //省略其他
? ? ? ? ? ? ? ? ? "table": "`mydb`.`t_adress` `a`", ?#数据库名.表名、别名
? ? ? ? ? ? ? ? ? "attached": "((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))" ?#附加条件
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ] /* attached_conditions_summary */
? ? ? ? ? ? } /* attaching_conditions_to_tables */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "finalizing_table_conditions": [ ?#优化后的最终where条件表达式
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_adress` `a`",
? ? ? ? ? ? ? ? "original_table_condition": "((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))",
? ? ? ? ? ? ? ? "final_table_condition ? ": "((`mydb`.`u`.`id` = 1) or (`mydb`.`a`.`id` = 1))"
? ? ? ? ? ? ? }
? ? ? ? ? ? ] /* finalizing_table_conditions */
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "refine_plan": [ #改善执行计划
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_user` `u`" ? ?#数据库名.表名、别名
? ? ? ? ? ? ? },
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? "table": "`mydb`.`t_adress` `a`" ?#数据库名.表名、别名
? ? ? ? ? ? ? }
? ? ? ? ? ? ] /* refine_plan */
? ? ? ? ? }
? ? ? ? ] /* steps */
? ? ? } /* join_optimization */
? ? },
? ? {
? ? ? "join_execution": { ?#展示执行阶段的过程
? ? ? ? "select#": 1,
? ? ? ? "steps": [
? ? ? ? ] /* steps */
? ? ? } /* join_execution */
? ? }
? ] /* steps */
}
MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 0 ? #信息过长被截断的字节数
? ? ? ? ? INSUFFICIENT_PRIVILEGES: 0 ? #当前用户是否有查看对象的权限,1为否(TRACE信息为空),0为是(TRACE信息有内容)
1 row in set (0.00 sec)
六、MySQL诊断命令使用:
说明:诊断命令用于了解数据库运行情况。
1.查看运行的线程(有process权限才可看所有,否则只看当前用户相关的):
mysql> show full processlist\G;
mysql> select * from information_schema.processlist\G; ?#功能同上
输出列表说明:
...
*************************** 2. row ***************************
? ? ?Id: 8 ? ? ? ? #标识
? ?User: root ? ? ?#执行当前SQL语句的用户名。system_user服务器端线程处理内部任务。unauthenticated user未完成认证的客户端线程。event_scheduler事件调度器监控线程
? ?Host: localhost #发送当前SQL语句的客户端主机名
? ? ?db: NULL ? ? ?#SQL语句所属数据库名
Command: Query ? ? #执行的命令,值:Refresh、Register Slave(注册从库)、Binlog Dump(将binglog内容发到从库)、Connect Out(从库正在连接主库)、Connect(从MySQL已连接主库)、Table Dump(将表内容发到从库)、Debug(生成调试信息)、Error(生成错误信息)、Quit(终止)、Sleep(等待)、Shutdown(关闭)、Ping(ping请求)、Kill(杀死另一线程)、Init DB(选择默认DB)、Create DB(创建DB)、Drop DB(删除db)、Execute(执行prepared statement)、Fetch(取结果)、Field List(取表字段)、Change user(改用户)、Close stmt(关闭prepared statement)、Reset stmt(重置prepared statement)、Set option(设置选项)、Statistics(生成状态信息)、Delayed insert(延迟插入)等
? ?Time: 0 ? ? ? ? #耗时,单位为秒
? State: starting ?#执行状态
? ?Info: show full processlist #当前执行的SQL语句
2 rows in set (0.00 sec)
2.查看服务器状态:
mysql> show status\G;
mysql> show global status like '%Slow%'\G;
3.查看MySQL变量:
mysql> show variables\G;
4.查看数据库/表相关信息:
(1)查看表/视图的状态:
mysql> show table status from mydb;
(2)查看索引信息:
mysql> show index from mydb.t_user;
5.查看存储引擎信息:
mysql> show engine innodb status\G;
mysql> show engine innodb mute;
6.查看binlog.xxx信息:
mysql> show master status; #查看最新一条
mysql> show binary logs; ? #查看所有
mysql> show master logs; ? #查看所有
mysql> show binlog events; #查看binlog中的事件
7.查看复制从库relay log事件信息:
mysql> show relaylog events;
8.查看slave线程信息:
mysql> show slave status;
9.查看存储过程信息:
mysql> show procedure status\G;
10.查看函数信息:
mysql> show function status\G;
11.查看触发器信息:
mysql> show triggers from 数据库名称;
12.查看warning/error等信息:
mysql> show warnings\G;
mysql> show count(*) warnings;
mysql> show errors\G;
mysql> show count(*) errors;
mysql> select @@error_count;
13.记录有用的SQL:
(1)查看连接的客户机列表:
mysql> select client_ip as ip, count(client_ip) as num from (select substring_index(host, ':', 1) as client_ip from information_schema.processlist) connect_info group by ip;
(2)查看执行超过1分钟的线程:
mysql> select concat('kill',id,':') from information_schema.processlist where COMMAND!='Sleep' and TIME > 60;
?
|