【2017年整理】innodb读书笔记上

上传人:爱****1 文档编号:990009 上传时间:2017-05-24 格式:DOCX 页数:8 大小:28.34KB
返回 下载 相关 举报
【2017年整理】innodb读书笔记上_第1页
第1页 / 共8页
【2017年整理】innodb读书笔记上_第2页
第2页 / 共8页
【2017年整理】innodb读书笔记上_第3页
第3页 / 共8页
【2017年整理】innodb读书笔记上_第4页
第4页 / 共8页
【2017年整理】innodb读书笔记上_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《【2017年整理】innodb读书笔记上》由会员分享,可在线阅读,更多相关《【2017年整理】innodb读书笔记上(8页珍藏版)》请在金锄头文库上搜索。

1、第一章、mysql 体系结构和存储引擎1.1、数据库和实例的区别数据库:物理操作系统或其他形式文件类型的集合。在 mysql 下数据库文件可以是 frm,myd ,myi,ibd结尾的文件。数据库实例:由数据库后台进程/线程以及一个共享内存区组成。mysql 数据库是但进程多线程的程序。1.2、mysql 的体系结构mysql 由连接池组件、管理服务和工具组件、sql 接口组建、查询分析器组件、优化器组件、缓存组件、插件是存储引擎、物理文件。示意图见书:P4.1.3、mysql 存储引擎1.3.1、innodb 存储引擎,特点支持外键、行锁、非锁定读(默认情况下读取不会产生锁 )、mysql-

2、4.1 开始支持每个 innodb 引擎的表单独放到一个表空间里。innodb 通过使用 MVCC 来获取高并发性,并且实现sql 标准的 4 种隔离级别,同时使用一种被称成 next-key locking 的策略来避免换读(phantom)现象。除此之外 innodb 引擎还提供了插入缓存(insert buffer)、二次写(double write)、自适应哈西索引(adaptive hash index)、预读(read ahead)等高性能技术。1.3.2、myisam 存储引擎,myisam 特点是不支持事物,适合 olap 应用,myisam 表由 MYD 和 MYI 组成。m

3、ysql-5.0 版本之前, myisam 默认支持的表大小为 4G,从 mysql-5.0 以后,myisam 默认支持 256T 的表单数据。myisam 只缓存索引数据,mysql-5.1.23 版本之前无论 32、64 位操作系统环境下,缓存索引的缓冲区最大只能 4G,在之后的版本中,64 位系统可以支持大于 4G 的索引缓冲区。1.3.3、NDB 存储引擎,2003 年 mysql 从索爱公司收购的 NDB 引擎,NDB 的特点是数据放在内存中,mysql-5.1 版本开始可以将非索引数据放到磁盘上。NDB 之前的缺陷是 join 查询是 mysql 数据库层完成的,而不是存储引擎完

4、成的,复杂的 join 查询需要巨大的网络开销,速度很慢。当前 mysql cluster7.2 版本中已经解决此问题,join 查询效率提高了 70 倍。1.3.4、memeory 存储引擎,将数据放到内存中,默认使用 hash 索引,不支持 text 和 blob 类型,varchara 是按照 char 的方式来存储的。mysql 数据库使用 memory 存储引擎作为临时表还存储中间结果集(intermediate result),如果中间集结果大于 memorg 表的容量设置,又或者中间结果集包含 text 和blog 列类型字段,则 mysql 会把他们转换到 myisam 存储引

5、擎表而放到磁盘上,会对查询产生性能影响。1.3.5、archive 存储引擎,压缩能力较强,主要用于归档存储。1.3.6、federated 存储引擎,不存储数据,他指向一台远程 mysql 数据库上的表。1.3.7、maria 存储引擎, myisam 的后续版本,支持缓存数据和索引,行锁设计,支持 mvcc,支持事务和非事务安全的选项,以及更好的 BLOG 字符类型的处理性能。1.3.8、其他存储引擎,sphinx 用于全文索引, infobright 用于数据仓库1.4、各引擎之间的对比可以通过 show engines 查看 mysql 对存储引擎的支持情况。1.5、连接 mysql第

6、二章、innodb 存储引擎2.1、第一章已经大概介绍 innodb 的特点2.2、innodb 引擎架构维护所有进程/线程需要访问的多个内部数据结构缓存磁盘上的数据,方便快速的读取,并且在对磁盘文件的数据进行修改之前在这里缓存重做日志缓存.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外、将已经修改的数据文件刷新到磁盘文件,同时保证数据库发生异常情况下 innodb 能恢复到正常运行状态。2.2.1、后台线程innodb 存储引擎后台有 7 个线程, 4 个 IO 线程,1 个 master thread,一个 lock 监控线程,一个错误监控线程。(当前

7、 5.5 版本,默认 IO 线程是 18 个,8 个读,8 个写,一个 insert buffer thread、一个 log thread,加上 master 线程、lock 监控线程、错误监控线程一共是 21 个)。可以通过 show variables like innodb_%io_threadsG 和 show engine innodb statusG 来查看相关信息。2.2.2、内存innodb 存储引擎内存由以下三个部分组成:缓冲池(buffer pool),重做日志缓存(redo log buffer),额外的内存池(additional memory pool)。分别使用

8、innodb_buffer_pool_size 和innodb_log_buffer_size、innodb_additional_mem_pool_size 的大小决定。可以使用 show engine innodb status 来查看 innodb_buffer_pool 的事情情况。在 BUFFER POOL AND MEMORY 里可以看到存储引擎缓存池的使用情况,buffer pool size 表明一共有多少缓冲帧(buffer frame),每个 buffer frame 为16K.buffer pool size 表明一共有多少缓冲帧、 free buffers 表示当前空闲

9、的缓冲帧、 database pages 表示已经使用的缓存帧、modified db pages 表示脏页的数量。innodb_buffer_pool_size:具体看,缓冲池中的数据库类型有:索引页、数据库页、undo 页、插入缓存页(insert buffer)、自适应 hash(adaptive hash index)、innodb 存储的锁信息(lock info)、数据字典信息(data dictionary)示意图见书 P24.注意:在 32 位 windows 下 innodb_buffer_pool_size 可以通过开启 AWE 功能突破内存限制,但是会自动禁用自适应 ha

10、sh(adaptive hash index).innodb_log_buffer_size:一般情况下 innodb 会每秒刷新 log buffer 到硬盘,因此保证每秒产生的事务梁在这个缓存大小之内就可以了。innodb_additional_mem_pool_size:当你的 innodb_buffer_pool_size 很大的时候,这个值也需要扩大。2.3、master thread2.3.1、master thread 源码分析void masteor_thread()loop: /主循环,间隔 10sfor(int i=0;i thread_sleep(1) /sleep 1

11、sdo log buffer flush to disk /每秒都要刷新日志缓存到硬盘if(last_one_second_iosinnodb_max_dirty_pages_pct)/如果缓存中的脏页比例大于配置中的innodb_max_dirty_pages_pct 就刷新 100 个脏页到硬盘do buffer pool flush 100 dirty pageif(no user activity) /如果当前没有活跃用户或者数据库关闭时,就跳入 background loopgoto backgroud loopsleep 1 second if necessary/每 10 秒执行

12、的操作if(last_ten_second_ios70%) /如果缓存中脏页比例大于 70%,就刷新 100 个脏页到硬盘,否则只刷新 10 个do buffer pool flush 100 dirty pageelse buffer pool flush 10 dirty pagedo fuzzy checkpoint /产生一个检查点goto loop:background loop: /backupgroud 循环do full purge /总是删除 bufferpool 中无用的 undo 页do merge 20 insert buffer /总是合并 20 哥插入缓存if no

13、t idle:/如果不空闲,就跳回主循环,如果空闲就跳入 flush loopgoto loop:elsegoto flush loopflush loop:do buffer pool flush 100 dirty page /总是刷新 100 个脏页到硬盘,直到缓存中的脏页比例小于innodb_max_dirty_pages_pctif(buf_get_modified_ratio_pctinnodb_max_dirty_pages_pct)goto flush loopgoto suspend loop /完成刷新脏页的任务后,跳入 suspend loopsuspend loop:s

14、uspend_thread() /将 master 线程挂起,等待事件激活waiting eventgoto loop:可以通过 show engine innodb statusG 命令查看 BACKGROUND THREAD 段关于 mster thread 的信息。这里主循环执行了 2857554 次,每秒的 thread 执行了 2857350 次,每十秒的 tread 执行了 285310 次,6239 次 background thread 和 6238 次 flush thread。这里的每秒和每十秒的比例差不多,证明服务器压力不是很大。-BACKGROUND THREAD-sr

15、v_master_thread loops: 2857554 1_second, 2857350 sleeps, 285310 10_second, 6239 background, 6238 flushsrv_master_thread log flush and writes: 30408862.3.2、master thread 的潜在问题1、由于硬件的发展,现在的硬件性能已经提高了很多,如果 innodb 每秒最大刷新 100 个脏页,那么效率会很低,为了解决这个问题,innodb plugin 提供了一个参数 innodb_io_capacity,用来表示磁盘 IO 的吞吐量,默认值

16、是 200,规则如下:在合并插入缓存时,合并插入缓存的数量为 innodb_io_capacity 的 5%。在从缓冲区刷新脏页时,啥新脏页的数量为 innodb_io_capacity。如果你使用的是 ssd 或者 raid10,你可以调高这个参数,知道符合你的硬件。2、关于 innodb_max_dirty_pages_pct 值的争议,如果值过大,内存也很大或者服务器压力很大,那么效率很降低,如果设置的值过小,那么硬盘的压力会增加,建议是在 75-80.并且 innodb plugin 引进了innodb_adaptive_flushng(自适应的刷新 ),该值影响每秒刷新脏页的数量。他会通过innodb_flush_get_desired_flush_rate 的函数判断需要刷新脏页最合适的量,这个函数是通过重做日志产生的速度来判断的。通过上述改进,innodb master thread 的为代码如

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号