日积月累mysql小知识点

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用户的密码)。

 

posted @ 2022-03-14 18:06  方山客  阅读(61)  评论(0编辑  收藏  举报