MySQL单个表信息获取(辅助性能分析)

1、show create  table  table_name 显示当前表结构信息
SHOW CREATE TABLE命令以一种便于阅读和操作的格式向用户呈现基本表中的当前列和索引定义的全部细节。该命令告诉用户如何用准确的语法来重新创建数据库表,
并且用户可以很容易地在给定表上针对新的或更改的索引、数据类型、是否为null 限制条件、字符集以及存储引擎创建优化。

2、SHOW TABLE STATUS  获取单表的存储信息
数据库各表的信息都保存在INFORMATION_SCHEMA-->TABLES表里。可以直接在此表查询也可以通过SHOW TABLE STATUS命令来查询。
SHOW TABLE STATUS LIKE 'user'\G;
结果:

*************************** 1. row ***************************
         

  Name: user(表名)
         Engine: InnoDB(存储引擎)
        Version: 10
     Row_format: Compact(行的格式,是否固定或压缩)
           Rows: 64352222(行数,对于MyISAM该值是精确的,但对于InnoDB该值是估计值)   通过select count 统计的是62014457,说明有出入
 Avg_row_length: 420 (平均每行的字节数,单位B)
    Data_length: 27085766656(表数据总的字节数,单位B)  27085766656 /1024/1024/1024 =25.2G
Max_data_length: 0(表数据的最大容量,和存储引擎有关)
   Index_length: 1889533952(索引的大小,单位B)   1889533952 /1024/1024/1024 = 1.75G
      Data_free: 144703488(对于MyISAM表示已分配但没有使用的空间)
 Auto_increment: 734233968(下一个AUTO_INCREMENT值)
    Create_time: 2018-07-16 09:52:07(表的创建时间)
    Update_time: NULL(表数据的最后修改时间)
     Check_time: NULL(使用CHECK TABLE或myisamchk检查表的时间)
      Collation: utf8_bin(表的默认字符集和字符列排序规则)
       Checksum: NULL(整个表的实时检验和)
 Create_options: (创建表时指定的其他选项)
        Comment:


这条命令的返回值的准确度取决于数据库使用的存储引擎。例 如,如果使用 MylSAM、MEMORY、ARCHIVE 或者 BLACKHOLE 存储引擎,
那么行的平均长度和行数就都是精确值。而如果是 InnoDB存储引擎,上述值都将是估计值并且可能有很大误差。

3、show processlist  显示哪些线程正在运行

参数:
 id       #ID标识,要kill一个语句的时候很有用
use      #当前连接用户
host     #显示这个连接从哪个ip的哪个端口上发出
db       #数据库名
command  #连接状态,一般是休眠(sleep),查询(query),连接(connect)
time     #连接持续时间,单位是秒
state    #显示当前sql语句的状态
info     #显示这个sql语句
其中state的状态十分关键,下表列出state主要状态和描述:

状态  描述
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已经处理完了所有待处理的插入操作,正在等待新的请求

1).Sleep状态
通常代表资源未释放,如果是通过连接池,sleep状态应该恒定在一定数量范围内
实战范例:因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产生大量sleep连接,在网速出现异常时,数据库too many connections挂死。
简单解读,数据查询和执行通常只需要不到0.01秒,而网络输出通常需要1秒左右甚至更长,原本数据连接在0.01秒即可释放,但是因为前端程序未执行close操作,直接输出结果,那么在结果未展现在用户桌面前,该数据库连接一直维持在sleep状态!
2).Waiting for net, reading from net, writing to net
偶尔出现无妨,如大量出现,迅速检查数据库到前端的网络连接状态和流量
案例:因外挂程序,内网数据库大量读取,内网使用的百兆交换迅速爆满,导致大量连接阻塞在waiting for net,数据库连接过多崩溃
3).Locked状态
有更新操作锁定
通常使用innodb可以很好的减少locked状态的产生,但是切记,更新操作要正确使用索引,即便是低频次更新操作也不能疏忽。如上影响结果集范例所示。
在myisam的时代,locked是很多高并发应用的噩梦。所以mysql官方也开始倾向于推荐innodb。
4).Copy to tmp table
索引及现有结构无法涵盖查询条件,才会建立一个临时表来满足查询要求,产生巨大的恐怖的i/o压力。
很可怕的搜索语句会导致这样的情况,如果是数据分析,或者半夜的周期数据清理任务,偶尔出现,可以允许。频繁出现务必优化之。
Copy to tmp table通常与连表查询有关,建议逐渐习惯不使用连表查询。
实战范例:
u 某社区数据库阻塞,求救,经查,其服务器存在多个数据库应用和网站,其中一个不常用的小网站数据库产生了一个恐怖的copy to tmp table操作,导致整个硬盘i/o和cpu压力超载。Kill掉该操作一切恢复。
5).Sending data
Sending data并不是发送数据,别被这个名字所欺骗,这是从物理磁盘获取数据的进程,如果你的影响结果集较多,那么就需要从不同的磁盘碎片去抽取数据,
偶尔出现该状态连接无碍。
回到上面影响结果集的问题,一般而言,如果sending data连接过多,通常是某查询的影响结果集过大,也就是查询的索引项不够优化。
如果出现大量相似的SQL语句出现在show proesslist列表中,并且都处于sending data状态,优化查询索引,记住用影响结果集的思路去思考。
6).Storing result to query cache
出现这种状态,如果频繁出现,使用set profiling分析,如果存在资源开销在SQL整体开销的比例过大(即便是非常小的开销,看比例),则说明query cache碎片较多
使用flush query cache可即时清理,也可以做成定时任务
Query cache参数可适当酌情设置。
7/Freeing items
理论上这玩意不会出现很多。偶尔出现无碍
如果大量出现,内存,硬盘可能已经出现问题。比如硬盘满或损坏。
i/o压力过大时,也可能出现Free items执行时间较长的情况。
8.Sorting for …
和Sending data类似,结果集过大,排序条件没有索引化,需要在内存里排序,甚至需要创建临时结构排序。

参考:

https://blog.csdn.net/sunqingzhong44/article/details/70570728

https://www.cnblogs.com/waterystone/p/5085974.html

https://dev.mysql.com/doc/refman/8.0/en/general-thread-states.html

猜你喜欢

转载自blog.csdn.net/l1394049664/article/details/81363433