1. show status 和 show innodb status 的区别
show status
可以查看mysql的运行状态,执行后发现查询结果多达几百行,我们可以从中获取许多常用信息,比如运行时间、连接、线程、锁、慢查询、buffer池等
具体使用可以查看官方文档 MySQL :: MySQL 5.7 Reference Manual :: 5.1.9 Server Status Variables
show innodb status
这个命令我在我5.7版本的mysql上执行显示命令错误,百度后发现这个是旧版本的命令,新版本的命令是 show engine innodb status。可以查看后台线程、信号量、死锁等。
具体可以看这个专业人员写的博客 MYSQL show engine innodb status 这么多年,你真的都懂? - 云+社区 - 腾讯云 (tencent.com)
2. 如何开启慢日志查询
首先可以通过 show variables like '%quer%' 来查看是否开启,一般默认是不开启的,slow_query_log的值是OFF。想要开启的话,需要修改/etc/my.cnf这个配置文件,在[mysqld]下面加上 slow_query_log = ON,然后重启mysql。
也可以通过修改全局变量来开启,这样不需要重启,执行如下语句 set @@global.slow_query_log = ON
另外,我们还可以将慢查询日志设置为存储到表(表和文件二选一),这个表是mysql.slow_log。操作命令为 set @@global.log_output='TABLE'
最后,介绍下分析慢查询日志的工具,有mysql自带的 mysqldumpslow,还有第三方的Percona Toolkit、pt-query-digest
3. 如何查看mysql死锁
1) 查看是否锁表 show OPEN TABLES where In_use > 0
2) 查看运行的线程 show full processlist
补充:
查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4. 使用性能剖析工具 show profiles
这个工具默认关闭的,先执行命令打开它,set profiling=1(这个命令不是全局的,只在本会话范围生效)。
1) 执行 SHOW PROFILES 可以看到打开profiling之后所有查询的执行时间;
2) 执行SHOW PROFILE [TYPE] FOR QUERY Query_ID 可以看到MySQL执行某个查询各个步骤的各项性能指标的详细信息:
如果没有指定FOR QUERY则显示最近一条查询的详细信息。TYPE是可选的,有以下几个选项:
- ALL 显示所有性能信息
- BLOCK IO 显示块IO操作的次数
- CONTEXT SWITCHES 显示上下文切换次数,不管是主动还是被动
- CPU 显示用户CPU时间、系统CPU时间
- IPC 显示发送和接收的消息数量
- MEMORY [暂未实现]
- PAGE FAULTS 显示页错误数量
- SOURCE 显示源码中的函数名称与位置
- SWAPS 显示SWAP的次数
5. information_schema
一般称之为元数据库,我们创建的库、表、列、索引、视图、存储过程等在这里面都可以检索到,所以也叫数据字典。另外我们之前提到过可以在INNODB_LOCKS这个表里查看正在被锁的事务。最后,我们还可以在INNODB_BUFFER_PAGE、INNODB_BUFFER_PAGE_LRU、INNODB_BUFFER_POOL_STATS这三个表中查看innodb缓存池的情况。
innodb中的页分三种,大家可以参考这篇博文 (23条消息) Innodb Buffer Pool的三种Page和链表_老叶茶馆-CSDN博客
还有这篇博文,直接从源码起底page的生命周期,绝对是大牛所作 MySQL · 引擎特性 · InnoDB Buffer Page 生命周期 (vicsdf.com)
关于innodb缓存池,本人目前也只是了解一点,这个比较底层,可能需要先熟悉操作系统虚存的段页机制、mysql源码,才能彻底弄懂这玩意儿。
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。 InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小: mysql> show variables like 'innodb_page_size'; 而系统一个磁盘块的存储空间往往没有这么大,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB。
好吧,最后我不得不承认走题了。
6. 为啥innodb缓存池中页的大小默认是16kb?
在操作系统的文件管理系统中进行一次io读写,默认读取的大小为4kb(一页)。又因为局部性原理,操作系统会将命中的页周围的三块页一同加载进innodb的缓存池中,因此innnodb缓存池中页的大小为16kb。
7. performance_schema
一个可以查看mysql运行性能的工具,无侵入性,使用代价低,在mysql5.7.x以上的版本都是默认开启的,需要注意以下几点:
1) 存储引擎都是performance_schema,保存在内存中,如果数据库重启,数据会丢失
2)通过监视server事件来监视server内部运行情况,这里的事件指函数调用、操作系统等待、sql执行等,写入binlog事件不在范围内。
可以参考这篇博文 (23条消息) 初相识|performance_schema全方位介绍_老叶茶馆-CSDN博客
8. sys库和mysql库分别干啥的?
sys库所有的数据源来自:performance_schema。目标是把performance_schema的复杂度降低,让DBA能更好地阅读这个库里的内容。让DBA更快地了解DB的运行情况;
mysql库,是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改root用户的密码)。