深入innodb
InnoDB表为IOT,采用了B+树类型,故每个页面至少要存储2行数据,如果行过大则会产生行溢出;
理论上InnoDB表中varchar可存储65535字节,但对于InnoDB其实际上限为65532,且该值为表所有varchar列长度总和;
对于utf8字符集,一个字符占3个字节,则其上限又缩小为1/3;
如果强行创建varchar(65535)的字段,在sql_mode不为restricted的情况下,其会被隐式转换为mediumtext;

不论是varchar还是blob/text,只要保证一个16k的页面能容下2行数据,应该不会行溢出
而一旦行溢出,字段前768字节(Antelope格式)依旧存放于当前页面,数据一般使用B-tree Node页,而溢出的行存放于Uncompress Blob页;
而barracuda采用了完全行溢出,即只保留字段的前20字节。

建议】不要在线上执行大的删除事务,而应该每次只删一小部分数据,持续删除并提交

Ø Innodb_scan_pages_contiguous
Counts the number of leaf pages that were read contiguously during the last query. It does not count the first page, so it will be 0 for single-page scans.

Ø Innodb_scan_pages_jumpy
Counts the number of leaf pages that were not read contiguously during the last query. It does not count the first page,
so it will be 0 for single-page scans. Because it measures leaf pages only and “branch pages” must be inserted for scans on large tables, it will always be nonzero for large tables.

Ø Innodb_scan_data_in_pages
Counts the bytes used by records in the leaf pages that were scanned during the last query. To make the implementation more efficient, it does not count the last page in the scan.

Ø Innodb_scan_garbage_in_pages
Counts the bytes occupied by garbage (not used by records) in the leaf pages that were scanned during the last query. To make the implementation more efficient, it does not count the last page in the scan

--查看数据信息
(system@127.0.0.1:3306) [test]> show table status like 'test_user'\G;
*************************** 1. row ***************************
Name: test_user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 9858355
Avg_row_length: 288
Data_length: 2843721728
Max_data_length: 0
Index_length: 214712320
Data_free: 7340032
Auto_increment: 10210001
Create_time: 2018-05-02 06:32:54
Update_time: NULL
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)

• 消除碎片
随机方式插入新数据,可能导致辅助索引产生大量的碎片,意思是索引page和索引顺序不接近,或者有大量的空洞。
执行 ALTER TABLE XX ENGINE = INNODB; 可以重整表空间,消除碎片
或者 备份数据表,删掉,重新导入
• 回收表空间
共享表空间无法在线回收,共享表空间想要回收的话,需要全部InnoDB表导出、删除、导回
数据表空间用上面的方法即可,或者直接清空不需要保存的历史表,临时表 TRUNCATE TABLE
• 检查点
⁻ innodb会批量的把buffer pool中的脏页以及redo log刷新到磁盘,称之为检查点
⁻ 并不是在一次刷新中刷新所有的内容,因为这样会降低mysql的性能.甚至无法提供服务
⁻ 在恢复的过程中,innodb会向前扫描事务日志,把这些脏数据刷新到磁盘中
⁻ innodb循环的使用它的事务日志,所以旧的日志必然在未来某一时刻被覆盖,innodb必须保证,在旧日志被覆盖之前,与这些旧的日志条目相关的脏数据都被刷新到了磁盘
⁻ 如果这一点不能保证,那么万一服务器crash,buffer pool中的脏页就永远也无法恢复了
⁻ 所以在切换日志的时候,innodb必然会做检查点,把所有的脏页都刷新到磁盘
⁻ 从这个意义上,innodb的事务日志越大,节省的磁盘IO越多,对系统性能越好。但是crash后恢复的时间肯定会变长
⁻ innodb的检查点每隔几秒就会做一次
⁻ 只是经过日志切换后,在日志被重用前,该日志的内容必须被全部刷新到磁盘,否则,系统就会被hung住
⁻ 尝试用大一点的事务日志,可以减少检查点过程中写磁盘的次数(之所以节省,是因为IO的合并)
Checkpoint触发条件
Ø 每1秒
• 若buffer pool中的脏页比率超过了srv_max_buf_pool_modified_pct = 75,则进行Checkpoint,刷脏页,flush PCT_IO(100)的dirty pages = 200
• 若采用adaptive flushing,则计算flush rate,进行必要的flush

Ø 每10秒
• 若buffer pool中的脏页比率未超过70%,flush PCT_IO(10)的dirty pages = 20
• 每10S,必定调用一次log_checkpoint,做一次Checkpoint
脏页比率 = 需要被flush的页面数 / (使用中的页面数 + 空闲页面数 + 1)

innodb_adaptive_flushing_lwm -- 设置redo log flush低水位线,当需要flush的redo log超过这个低水位线时,立即强制启用adaptive flushing,即便没有设置使用adaptive flushing机制
innodb_io_capacity = N -- 设置InnoDB后台进程最大的IO性能指标,例如从buffer pool中刷新刷新数据页,从insert buffer中合并数据等。默认值是200,在繁忙的OLTP模式下,需要适当提高。
单盘5400或7200转的配置下,最小也可以设置为100,如果是15000转多盘做RAID,那么可以设置更高了。
innodb_io_capacity_max =N -- innodb_io_capacity在紧急情况下的上限值
innodb_flushing_avg_loops =N -- 设置InnoDB统计前N个page flush速率,避免太快flush
后台进程(15个):
• master thread(1个)
• lock monitor thread(1个)
• error monitor thread(1个)
• log thread(1个)
• insert buffer thread(1个)
• read/write thread(8个,默认各4个)
• purge thread(1个)
• page cleaner thread(1个)
master thread的线程优先级别最高。
其内部几个循环(loop)组成:主循环(loop),后台循环(background loop),刷新循环(flush loop),暂停循环(suspend loop)。

每秒一次的操作包括:
日志缓冲(log buffer)刷新到磁盘,即使这个事务还没有提交(总是)
合并插入缓冲(insert buffer)(可能)
至多刷新100个innodb的缓冲池(buffer pool)中的脏页(dirty page)到磁盘(可能)
如果当前没有用户活动,切换到background loop(可能)

接着来看每10秒的操作,包括如下内容:
刷新100个脏页到磁盘(可能)
合并至多5个插入缓冲(总是)
将日志缓冲刷新到磁盘(总是)
删除无用的undo页(总是)
刷新100个或者10个脏页到磁盘(总是)
产生一个检查点(总是)

重点】几个关键点:
1、dirty pages不要堆积太多,否则热点数据不能被有效缓存,命中率低,并且瞬间大批量刷新dirty pages时也影响IOPS;
2、undo pages不要堆积太多,否则ibdata1可能暴涨,或者tps受到影响;
3、checkpoint不要延迟太厉害,否则crash recovery进程很慢;
4、记住最重要的一点:让这些后台进程有条不紊按照固定频率工作着,不要有停滞,也不要太频繁。

InnoDB监控触发器
• innodb_monitor
• innodb_lock_monitor
• innodb_table_monitor
• innodb_tablespace_monitor
innodb一些参数
innodb_buffer_pool_size #50-70
ibu太小有什么问题:
ERROR 1206 (HY000): The total number of locks exceeds the lock table size 错误解决,http://imysql.com/2007_08_03_locks_exceeds
innodb_buffer_pool_instances #切分很多小实例,内存利用率
innodb_data_file_path
innodb_max_dirty_pages_pct=20-50
innodb_flush_method =O_DIRECT #xfs文件系统上,仍旧使用O_DIRECT就好
innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit =1
sync_binlog =1

深入 innodb的更多相关文章

  1. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

  2. InnoDB关键特性学习笔记

    插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...

  3. InnoDB体系结构学习笔记

    后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...

  4. InnoDB:Lock & Transaction

    InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...

  5. innodb 自增列重复值问题

    1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, ...

  6. MySql - InnoDB - 事务 , Php版

    (出处:http://www.cnblogs.com/linguanh/) 1,前序 由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式 ...

  7. MySQL的InnoDB索引原理详解

    摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节. InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档).本着高效学习的目的,本篇 ...

  8. MySQL存储引擎--MyISAM与InnoDB区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISA ...

  9. MySQL 从 5.5 升级到 5.6,启动时报错 [ERROR] Plugin 'InnoDB' init function returned error

    MySQL 从 5.5 升级到 5.6,启动时报错: [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'Inn ...

  10. Mysql 存储引擎中InnoDB与Myisam的主要区别

    一直以为我spring事物没有配置好,结果发现是mysql的表本身设置成了Myisam 引擎.改成innodb就支持事物了. 1, 事务处理 innodb 支持事务功能,myisam 不支持. Myi ...

随机推荐

  1. codis3.2安装配置中的一些问题

    1.参考文档与参考资料问题 安装codis集群之前,我先在网上找资料,然后又到github的项目官方地址找,不得不说,相关的资料不好找,而且找到之后有些东西说的也不是很清楚.由于codis版本迭代的问 ...

  2. iOS开发:MKMapView地图内存持续增加的释放解决办法

    内存持续增加的释放解决办法 最近修改一个用到MKMapView的项目,内存一直占用过多,每次拖拽地图时还会增加占用,且一直无法释放. 经过两天的排查,最后锁定是创建的self.map对象在加载地图的时 ...

  3. New Concept English there (7)

    27w/m Has it ever happened to you? Have you ever put your trousers in the washing machine and then r ...

  4. 【这些年】Linux C/C++软件开发用过的工具

          这些年一直从事Linux下C/C++软件开发,学习工作中用到了不少开发工具,一直想做个总结,却总是因为这个原因那个原因,未能动笔.趁今天天气凉爽,空气清新,花点儿功夫,做一个小结啦,防止以 ...

  5. SQL 测验

    1.SQL 指的是? 您的回答:Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? 您的回答:SELECT 3.哪条 SQL 语句用于更新数据库中的数据 ...

  6. C#中正则表达式编程(未完,待补充)

    对于只存储一个匹配,可用Match类: 一般模式: Regex reg = new Regex(string pattern); string str = "###############& ...

  7. Postfix邮件黑名单和白名单

    本文主要介绍如何用Postfix添加域名黑名单和白名单,用以处理垃圾邮件. 1.修改postfix主配置文件,增加限制语句 vim /etc/postfix/main.cf # 文末添加一行,限制往本 ...

  8. Buildroot 使用默认配置

    /******************************************************************************** * Buildroot 使用默认配置 ...

  9. 【排序】归并排序,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(分治法)       归并排序中, “归”代表递归的意思,即递归的将数组通过折半的方式分离为单个数组. “ ...

  10. Centos kvm+ceph

    Centos kvm+ceph 一. centos6.5 安装kvm 1. disable selinux 2. 确认支持intel虚拟化 3. 安装需要的包 4.设置桥接网络 5.运行kvm ins ...