博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL深入分析InnoDB2020-11-22
阅读量:4172 次
发布时间:2019-05-26

本文共 7781 字,大约阅读时间需要 25 分钟。

MySQL深入分析InnoDB

概述

MySQL 在整体架构上分为 Server 层和存储引擎层。

其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 InnoDB、MyISAM、Memory 等引擎。在客户端连接到 Server 层后,Server 会调用数据引擎提供的接口,进行数据的变更。

单点(Single),适合小规模应用,复制(Replication),适合中小规模应用,集群(Cluster),适合大规模应用。

InnoDB数据字典

数据字典,数据库的元数据。

Mysql 5.7之前< 系统表空间+frm文件

Mysql8.0以后> 系统表空间

1.1  SQL查询

 

select c.column_name as '字段名',c.column_type as '数据类型',c.is_nullable as '允许为空',c.column_key as 'PK',c.column_comment as '字段说明'

from columns c inner join tables t on c.table_schema=t.table_schema  and c.table_name=t.table_name where t.table_schema='itpuxdb'  and t.table_name='itpux_m5';

二 InnoDB状态的监控管理

2.1 innodb monitor 类型

-- standard monitor

show variables like '%innodb_status%';

set global innodb_status_output=on;

show engine innodb status\G

 

--lock monitor

show variables like '%innodb_status%' ;

set global innodb_status_output=on;

set global innodb_status_output_locks=on;

show engine innodb status\G

 

--tablespace monitor

select * from information_schema.TABLESPACES;

select * from information_schema.innodb_sys_tablespaces;

 

--table monitor

select * from information_schema.tables;

select * from information_schema.innodb_sys_tables;

select * from information_schema.innodb_sys_tablestats;

2.2 详细show engine innodb status\G解释

 

 

2.3 常用信息查询SQL

2.3.1 查询各数据库大小

select TABLE_SCHEMA dbname,round(sum(DATA_LENGTH + INDEX_LENGTH)/1024/1024) "DBSIZE-BM" from information_schema.TABLES group by TABLE_SCHEMA;

 

2.3.2 查询表和索引大小

行数和表大小 MB

 

select TABLE_SCHEMA,table_name,ROUND(TABLE_ROWS/10000) 万行,round(data_length/1024/1024) MB from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='itpuxdb' ;

表索引大小

select TABLE_SCHEMA,table_name,round(index_length/1024/1024) INDEXMB from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='itpuxdb';

 

行数和表大小和索引大小,总体大小

 

select TABLE_SCHEMA,table_name,ROUND(TABLE_ROWS/10000) 万行,round(data_length/1024/1024) DBMB, round(index_length/1024/1024) INDEXMB, round((index_length+data_length)/1024/1024) TOTALMB from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='itpuxdb' order by  TOTALMB desc;

 

 

三  show engine innodb status\G 详解

mysql日常操作中,妙用pager设置显示方式,可以大大提高工作效率。比如select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到,这时候使用pager可以设置调用os的more或者less等显示查询结果。

pager less;

PAGER set to 'less'

 

 

2020-11-22 18:05:39 0x7fdb7838e700 INNODB MONITOR OUTPUT   ##输出的时间。

=====================================

Per second averages calculated from the last 50 seconds                //最近50秒内每2秒的平均值

 

3.1 BACKGROUND THREAD     ##后台线程

BACKGROUND THREAD     ##后台线程,可反映数据库的压力情况,测试环境毫无压力。

-----------------

srv_master_thread loops: 1 srv_active, 0 srv_shutdown, 1692 srv_idle

srv_master_thread log flush and writes: 1693

 

Innodb存储引擎室多线程的模型,因此其后台有多个不同的后台线程负责处理不同的任务。Master thread是一个非常核心的后台线程,主要负责缓冲池中的数据异步刷新到磁盘,保证数据的一致性。

Srv_master_thread loops是Master线程的循环次数,每次循环每次循环时会选择一种状态(active、shutdown,idle)执行, 其中Active,数量增加与数据变化有关,与查询无关,可以通过srv_active 和srv_idle 的差异看出;通过对比active 和idle的值,来获得系统整体负载情况,如果Active 的值越大,证明服务越繁忙。

3.2  SEMAPHORES ##信号

SEMAPHORES

----------

OS WAIT ARRAY INFO: reservation count 9     //os wait 的信息 ,reservation count 表示InnoDB产生了多少次OS WAIT
OS WAIT ARRAY INFO: signal count 8  // 进行OS WAIT线程,接收到多少次信号(single)被唤醒,如果这个single数值越大,几十万或者几百万,可能是很多I/0等待或者是InnoDB争用问题(关于争用问题可能与OS调度有关,可以尝试减少innodb_thread_concurrency参数)

 

RW-shared spins 0, rounds 12, OS waits 6  // Mutex spin线程无法获取锁而进入Spin wait ,rounds是spin wait 进行轮询检查mutextes的次数,os wait 线程放弃spin-wait 进入挂起状态
RW-excl spins 0, rounds 0, OS waits 0  // RW-excl 排他锁
RW-sx spins 0, rounds 0, OS waits 0   /

Spin rounds per wait: 12.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx

 

3.3 TRANSACTIONS 事务

 

lock table itpux_m1 write;

Query OK, 0 rows affected (0.00 sec)

表锁以后,下面监控马上就有显示了

 

 

------------

TRANSACTIONS

------------

Trx id counter 27160    ##事务标识  27160

Purge done for trx's n:o < 27159 undo n:o < 0 state: running but idle

Purge done for trx's n:o < 27159 ##已经完成的被清理的事务标识

History list length 1           ##没有被清理的事务数长度

LIST OF TRANSACTIONS FOR EACH SESSION:

---TRANSACTION 421806966745824, not started

0 lock struct(s), heap size 1136, 0 row lock(s)

---TRANSACTION 27159, ACTIVE 5 sec

mysql tables in use 1, locked 1

1 lock struct(s), heap size 1136, 0 row lock(s)

MySQL thread id 9, OS thread handle 140329701377792, query id 130 localhost root

 

3.4 FILE I/O

都是十个线程IO 一个更改线程,一个日志线程,4个读线程,4个写线程。

I/O thread 0 state: waiting for completed aio requests (insert buffer thread)

I/O thread 1 state: waiting for completed aio requests (log thread)

I/O thread 2 state: waiting for completed aio requests (read thread)

I/O thread 3 state: waiting for completed aio requests (read thread)

I/O thread 4 state: waiting for completed aio requests (read thread)

I/O thread 5 state: waiting for completed aio requests (read thread)

I/O thread 6 state: waiting for completed aio requests (write thread)

I/O thread 7 state: waiting for completed aio requests (write thread)

I/O thread 8 state: waiting for completed aio requests (write thread)

I/O thread 9 state: waiting for completed aio requests (write thread)

Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,

 ibuf aio reads:, log i/o's:, sync i/o's:

Pending flushes (fsync) log: 0; buffer pool: 0

1125 OS file reads, 4076 OS file writes, 148 OS fsyncs

  1. reads/s, 0 avg bytes/read, 7 writes/s, 0.00 fsyncs/s

 

3.5 INSERT BUFFER AND ADAPTIVE HASH INDEX

变更缓冲区

-------------------------------------

INSERT BUFFER AND ADAPTIVE HASH INDEX

-------------------------------------

Ibuf: size 1, free list len 0, seg size 2, 0 merges

merged operations:

 insert 0, delete mark 0, delete 0

discarded operations:

 insert 0, delete mark 0, delete 0

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 75 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

Hash table size 553193, node heap has 0 buffer(s)

  1. hash searches/s, 0 non-hash searches/s

 

 

3.6 LOG

LOG

Log sequence number 185680680      --表示当前的LSN

Log flushed up to   185680680      --表示刷新到重做日志文件的LSN

Pages flushed up to 185680680       --下一次即将做checkpoint lsn 的位置;在没有新数据的写入的情况下。

Last checkpoint at  185680671           --写入到磁盘后的LSN号(一个检查点表示一个数据和日志文件都处于一致状态的时刻,并且能用于恢复数据)

0 pending log flushes, 0 pending chkp writes

31 log i/o's done, 0.00 log i/o's/second

 

Log sequence number,Log flushed up to,Pages flushed up to一致即可。0 pending log flushes, 0 pending chkp writes是不是0。

3.7 BUFFER POOL AND MEMORY

Total large memory allocated 2198863872  # 为innodb 分配的总内存数(byte)

Dictionary memory allocated 229704

Buffer pool size   131056    ##131056*16K/1024=2G

Free buffers       129088

Database pages     1895

Old database pages 0

Modified db pages  0

Pending reads      0

Pending writes: LRU 0, flush list 0, single page 0

Pages made young 0, not young 0

0.00 youngs/s, 0.00 non-youngs/s

Pages read 1083, created 812, written 3776

0.00 reads/s, 0.00 creates/s, 0.05 writes/s

Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s   ##  #这行显示了innodb被读取,创建,写入了多少页,读/写页的值是指的从磁盘读到缓冲池的数据,或者从缓冲池写到磁盘中的数据,创建页指的是innodb在缓冲池中分配但没有从数据文件中读取内容的页,

LRU len: 1895, unzip_LRU len: 0

I/O sum[0]:cur[0], unzip sum[0]:cur[0]

 

Buffer pool hit rate 1000 / 1000 ##缓冲池命中率,它度量自上次Innodb状态输出后到本次输出这段时间内的命中率。

 

3.8 ROW OPERATIONS

 

ROW OPERATIONS

--------------

0 queries inside InnoDB, 0 queries in queue

0 read views open inside InnoDB

Process ID=5534, Main thread ID=140328258492160, state: sleeping

Number of rows inserted 358, updated 300000, deleted 0, read 600465  ##多少行被插入,更新,删除,读取。

0.18 inserts/s, 0.00 updates/s, 0.00 deletes/s, 833.50 reads/s   ##这行显示了对应上面一行的每秒平均值,如果想查看innodb有多少工作量在进行,那么这两行是很好的参考值

----------------------------

END OF INNODB MONITOR OUTPUT

 

 

END OF INNODB MONITOR OUTPUT #要注意了,如果看不到这行输出,可能是有大量事务或者是有一个大的死锁截断了输出信息

 


转载地址:http://wabai.baihongyu.com/

你可能感兴趣的文章
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>
内核线程创建
查看>>
linux中cat命令使用详解
查看>>
java中的异常机制
查看>>
java SE面向对象思维导图
查看>>
三维分析之视频投放
查看>>
SuperMap iDesktop之栅格值怎么查
查看>>
SuperMap iClient3D for WebGL教程-orientation
查看>>
SuperMap iClient3D for WebGL教程-description描述属性
查看>>
SuperMap iClient3D for WebGL教程-CallbackProperty
查看>>
如何修改leaflet聚合图的层级和样式
查看>>
三维分析之开敞度分析
查看>>
BIM+GIS应用的八大挑战
查看>>
.net实现.aspx页面自动加载.cs程序定义的变量并按照格式输出
查看>>
[Leetcode]最后一个单词的长度
查看>>
merges sort use c++
查看>>
插入排序用递归实现
查看>>
工作流审批平台-审批流程-指定审批部门
查看>>