innodb内存优化--(深入浅出读书笔记)

===Innodb内存优化===
1.innodb用一块内存区做IO缓存池,缓存索引块+数据块;缓存池逻辑上由free list空闲缓存块列表、flush list刷新到磁盘的缓存块列表、LRU list(innodb正在使用的缓存块,buffer pool 的核心)组成;
 
2.对于较大的缓存池,适当增大此参数的值,可以降低并发导致的内部缓存访问冲突;
 
3.控制innodb buffer刷新,延长数据缓存时间,减缓I/O;(buffer pool中的数据在缓存的时间越长,IO就会尽可能的少)涉及到两个参数。
  一个参数:innodb_max_dirty_pages 控制缓存池中脏页的最大比例,默认值是75%;
  另外一个:innodb_io_capacity 代表磁盘系统的IO能力,在一定程度上表示磁盘每秒可以完成的IO次数。
 
3.双写 doublewrite 
(partial page write 页断裂的问题,innodb的page size是16kb,数据校验也是针对16kb来计算的,将数据写入磁盘是以page为单位操作的,16k的数据在非人为性的问题上,容易出现部分数据丢失)
double write就是解决页断裂的问题,当MySQL将脏数据flush到datafile,先使用memecopy将脏数据复制到内存中的double write buffer,再通过double write buffer 分两次,每次写1M到共享表空间,再调用fsync函数,同步到磁盘上。doublewrite是顺序写,开销不大;
 
 ps:在网上找了一张图,可以更方便理解与记忆
 
  双写DWB会有一些缺点,在共享表空间上的double write buffer实际上也是一个文件,写DWB会导致出现很多fsync操作,但是double write 是一个连接的存储空间,写数据的时候是顺序写,性能比较高;每次将数据从DWB 写入到真正的segment(由区组成的段)系统会自动合并连接空间刷新的方式,每次可以刷新多个page;
 
4.用户服务线程排序缓存区
  参数 sort_buffer_size 来增大排序缓存区,可以提高order by group by的性能。
原文地址:https://www.cnblogs.com/Kid-Zhou/p/8512883.html