IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JavaEE:MySQL优化工具使用 -> 正文阅读

[Java知识库]JavaEE:MySQL优化工具使用

一、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;


?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:22:50  更:2022-03-22 20:24:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:23:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码