MySQL
常用语句
用户相关\管理相关\数据相关
视图\事件\存储过程\函数\游标\触发器
事务\分区
常用工具
管理优化
锁问题
MySQL日志
异步复制
半同步复制
复制管理
5.7开启并行复制
双主备份
故障问题
索引
时区
表的导出导入
MySQLdump逻辑备份
XtraBackup全备
XtraBackup增备
XtraBackup原表数据恢复
安装MySQL
ProxySQL中间件
Atlas中间件
keepalived安装
MHA安装
MHA恢复
mha复制检查报错及解决过程
集群Cluster安装
维护Cluster
开启审计功能
本文档使用MrDoc发布
返回首页
-
+
管理优化
2020年4月24日 20:40
admin
#SHOW STATUS >####查看MySQL本次启动后的运行时间(单位:秒) show status like 'uptime'; >####查看select语句的执行数 show [global] status like 'com_select'; >####查看insert语句的执行数 show [global] status like 'com_insert'; >####查看update语句的执行数 show [global] status like 'com_update'; >####查看delete语句的执行数 show [global] status like 'com_delete'; >####查看试图连接到MySQL(不管是否连接成功)的连接数 show status like 'connections'; >####查看线程缓存内的线程的数量。 show status like 'threads_cached'; >####查看当前打开的连接的数量。 show status like 'threads_connected'; >####查看当前打开的连接的数量。 show status like 'threads_connected'; >####查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。 show status like 'threads_created'; >####查看激活的(非睡眠状态)线程数。 show status like 'threads_running'; >####查看立即获得的表的锁的次数。 show status like 'table_locks_immediate'; >####查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。 show status like 'table_locks_waited'; >####查看创建时间超过slow_launch_time秒的线程数。 show status like 'slow_launch_threads'; >####查看查询时间超过long_query_time秒的查询的个数。 show status like 'slow_queries'; --- #SHOW PROCESSLIST >##SHOW PROCESSLIST显示哪些线程正在运行 >如果您有root权限,您可以看到所有线程。否则,您只能看到登录的用户自己的线程,通常只会显示100条如果想看跟多的可以使用full修饰(show full processlist) #show full processlist 参数: id #ID标识,要kill一个语句的时候很有用 use #当前连接用户 host #显示这个连接从哪个ip的哪个端口上发出 db #数据库名 command #连接状态,一般是休眠(sleep),查询(query),连接(connect) time #连接持续时间,单位是秒 state #显示当前sql语句的状态 info #显示这个sql语句 >|状态|描述| |--|--| |Checking table|正在检查数据表(这是自动的)。 |Closing tables|正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。 |Connect Out|复制从服务器正在连接主服务器。 |Copying to tmp table on disk|由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。 |Creating tmp table|正在创建临时表以存放部分查询结果。 |deleting from main table|服务器正在执行多表删除中的第一部分,刚删除第一个表。 |deleting from reference tables|服务器正在执行多表删除中的第二部分,正在删除其他表的记录。 |Flushing tables|正在执行FLUSH TABLES,等待其他线程关闭数据表。 |Killed|发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。 |Locked|被其他查询锁住了。| |Sending data|正在处理SELECT查询的记录,同时正在把结果发送给客户端。 |Sorting for group|正在为GROUP BY做排序。 |Sorting for order|正在为ORDER BY做排序。 |Opening tables|这个过程应该会很快,除非受到其他因素的干扰。例如,在执ALTER TABLE或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。 |Removing duplicates|正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。| |Reopen table|获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。 |Repair by sorting|修复指令正在排序以创建索引。 |Repair with keycache|修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。 |Searching rows for update|正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。 |Sleeping|正在等待客户端发送新请求. |System lock|正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。 |Upgrading lock|INSERT DELAYED正在尝试取得一个锁表以插入新记录。 |Updating|正在搜索匹配的记录,并且修改它们。 |User Lock|正在等待GET_LOCK()。 |Waiting for tables|该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。 |waiting for handler insert|INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。 --- #EXPLAIN >##使用方法: explain [partitions] < SQL语句 >; #参数说明: explain partitions :查看SQL语句查询的分区 >![](/media//202004/2020-04-25095101820350.png) >|参数|描述| |--|--| |id|选择标识符 |select_type|表示查询的类型。 |table|输出结果集的表 |partitions|匹配的分区 |type|表示表的连接类型 |possible_keys|表示查询时,可能使用的索引 |key|表示实际使用的索引 |key_len|索引字段的长度 |ref|列与索引的比较 |rows|扫描出的行数(估算的行数) |filtered|按表条件过滤的行百分比 |Extra|执行情况的描述和说明 --- >##一、 ID >####SELECT识别符。这是SELECT的查询序列号 我的理解是SQL执行的顺序的标识,SQL从大到小的执行 1. id相同时,执行顺序由上至下 2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 >####查看在研发部并且名字以Jef开头的员工,经典查询 explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like 'Jef%' and d.name = '研发部'; >![](/media//202004/2020-04-25101113524352.png) --- >##二、select_type >####示查询中每个select子句的类型 >|参数|描述| |--|--| |SIMPLE|简单SELECT,不使用UNION或子查询等| |PRIMARY|子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY| |UNION|UNION中的第二个或后面的SELECT语句| |DEPENDENT UNION|UNION中的第二个或后面的SELECT语句,取决于外面的查询| |UNION RESULT|UNION的结果,union语句中第二个select开始后面所有select| |SUBQUERY|子查询中的第一个SELECT,结果不依赖于外部查询| |DEPENDENT SUBQUERY|子查询中的第一个SELECT,依赖于外部查询| |DERIVED|派生表的SELECT, FROM子句的子查询| |UNCACHEABLE SUBQUERY|一个子查询的结果不能被缓存,必须重新评估外链接的第一行| --- >##三、table >####显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称 --- >##四、type >####对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。 ALL、index、range、 ref、eq_ref、const、system、NULL (从左到右,性能从差到好) >|参数|描述| |--|--| |ALL|Full Table Scan, MySQL将遍历全表以找到匹配的行 |index|Full Index Scan,index与ALL区别为index类型只遍历索引树 |range|检索给定范围的行,使用一个索引来选择行 |ref|表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 |eq_ref|类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件 |const、system|当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system |NULL|MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。 --- >##五、possible_keys 指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null) --- >##六、Key key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中 --- >##七、key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) --- >##八、ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 --- >##九、rows 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 --- >##十、Extra 该列包含MySQL解决查询的详细信息 |参数|描述| |--|--| |Distinct|一旦MYSQL找到了与行相联合匹配的行,就不再搜索了 |Not exists|MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了 |Range checked for each Record(index map:)|没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一 |Using filesort|看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 |Using index |列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候 |Using temporary |看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上 |Using where|使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题 #SHOW PROFILE >##SHOW PROFILES 查看所有语句的消耗时间 >![](/media//202004/2020-04-25103429672837.png) --- >##SHOW PROFILE [选项] FOR QUERY <QUERY_ID> <QUERY_ID>可在SHOW PROFILES中查看。 -------------------------------------------------------- 选项说明: ALL: 显示所有的开销信息 BLOCK IO : 显示块IO相关开销 CONTEXT SWITCHS: 上下文切换相关开销 CPU : 显示cpu 相关开销 IPC: 显示发送和接收相关开销 MEMORY: 显示内存相关开销 PAGE FAULTS: 显示页面错误相关开销信息 SOURCE : 显示和Source_function ,Source_file,Source_line 相关的开销信息 SWAPS: 显示交换次数相关的开销信息 -------------------------------------------------------- 参数说明: status:表示的是PROFILE里的状态,它和PROCESSLIST的状态基本是一致的 duration:消耗时间 > ![](/media//202004/2020-04-25104539959387.png) #分析与检查表 analyze table <表名>; #分析表 check table <表名>; #检查表 #优化表 optimize table <表名>; 说明:此命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费。只对MyISAM、BDB和InnoDB表起作用。
分享到: