1.InnoDB缓冲池简介 InnoDB在内存中维护一个叫做缓冲池的存储区域来缓存数据和索引。了解InnoDB缓冲区如何工作,如何利用它来在内存中保存被频繁访问的数据,对Mysql调优至关重要。可以通过对InnoDB缓冲的各方面进行配置来改善Mysql的性能。理想情况下,可以将缓冲池设置为实际需要的值,为服务器上运行的其他进程保留足够内存以防发生过度交换。缓冲池越大,InnoDB就越像一个内存库,从磁盘上读取一次数据,后续只从内存中读取数据。大内存64位系统,可以把缓冲池分为多个部分,以便最小化并发操作时对内存结构的冲突。尽管会突然增加类似备份或报表类的活动,但依然可以将频繁访问的数据保存在内存中。预期不久将需要某些数据页,则可以控制InnoDB将数据页预先异步读入缓冲池的时间和方式。可以控制后台进程何时将脏页刷出到磁盘,以及InnoDB是否基于工作负载动态调整刷出脏页的频率。可以配置InnoDB保留当前的缓冲池状态,以避免服务器重启后发生过长的温启动时间。也可以在服务器运行时保存当前的缓冲池状态。
2.Innodb缓冲池LRU算法 Innodb将缓冲池作为链表并通过最近最少使用(LRU)的变种算法进行管理。当需要为缓冲池增加新页时,InnoDB对最近最少使用的页进行驱逐,并将新页增加到链表的中部。这种“中间点插入策略”将链表看做两个子链表:链表头部为最近被存取过的“新”(或“年轻”)页的子链表,链表尾部为最近较少被存取的“旧”页的子链表。这个算法把经常被查询使用的页保持在新的子链表中。旧的子链表则包含较少用到的页;这些页是将来被驱逐的候选页。LRU算法默认操作如下:缓冲池的3/8用作旧的子链表。链表中点是新的子链表尾部与旧的子链表头部衔接的边界。当InnoDB往缓冲池读入一个页时,会将该页插入到链表的中点(旧的子链表的头部)。当用户进行类似查询的特定操作需要数据页或InnoDB进行预读操作时,InnoDB会将其读入缓冲池。存取旧的子链表中的页会使其变得“年轻”,因为会将其移向缓冲池的头部(新的子链表的头部)。如果因为需要而将一个页读入缓冲池,则立即发生首次读取并使其变得年轻。如果因为预读而将一个页读入缓冲池,则并不立即发生首次存取(也许在该页被驱逐前根本就不会被读取)。随着数据库操作的进行,缓冲池中未被存取的页通过移向链表尾部而变老。其他也变新的同时,新旧子链表中的页变老。随着页被插入链表中点,旧子链表中的页也会变老。最终,长时间未被使用的页会到达旧子链表尾部而被驱逐。默认的,查询读取的页会立即移到新子链表,这意味着它们将会更长时间留在缓冲池中。表扫描(像mysqldump操作或没有where子句的select语句引发的)能将大量数据带入缓冲池,并驱逐同等数量的旧数据,即使新数据还从未用过。类似的,被后台进程预读加载的页,接着仅被存取一次就移到新链表的头部。这些情况会频繁的将被用过的页推到旧子链表,从而将被驱逐。InnoDB标准监视输出在属于缓冲池LRU算法的BUFFER POOL AND MEMORY部分包含几个域。
3.InnoDB缓冲池配置选项 有几个配置选项会影响InnoDB缓冲池的不同方面。innodb_buffer_pool_size:确定缓冲池的大小。innodb_buffer_pool_chunk_size:定义InnoDB缓冲池改变大小时的块(chunk)大小。innodb_buffer_pool_instances:将缓冲池分为用户指定数目的独立区,每个有自己的LRU链表和相关的数据结构,以减少并发内存读写期间的冲突。innodb_old_blocks_pct:为用作旧子链表的缓冲池指定一个近似比例。innodb_old_blocks_time:指定首次访问后插入旧子链表的页,至少在旧子链表停留多少毫秒才能被移入新子链表。innodb_read_ahead_threshold:控制InnoDB将页预读进缓冲池的线性预读的灵敏度。innodb_random_read_ahead:开启将页预读进缓冲池的随机预读技术。innodb_adaptive_flushing:确定是否基于工作负载动态调整缓冲池中脏页的刷出率。innodb_flush_neighbors:确定从缓冲池刷出页时是否也刷出同一个范围内的其他脏页。innodb_flushing_avg_loops:InnoDB保持先前计算的刷出状态快照的迭代次数,用于控制针对负载变化自适应刷出的反应速度。innodb_lru_scan_depth:影响缓冲池刷出操作的算法和试探法的一个参数。主要用于性能专家对I/O密集的负载进行调试。innodb_max_dirty_pages_pct:InnoDB尽力从缓冲中刷出数据以便脏页的百分比不超过该值。innodb_max_dirty_pages_pct_lwm:开启预刷出控制脏页率时表示脏页百分比的低水位线。innodb_buffer_pool_filename:指定一个用于保存innodb_buffer_pool_dump_at_shutdown或innodb_buffer_pool_dump_now产生的表空间ID和页ID列表的文件名。innodb_buffer_pool_dump_at_shutdown:为了缩短下次重启时温启动过程的耗时,指定mysql服务器关闭时是否记录缓冲池中缓冲的页。innodb_buffer_pool_load_at_startup:指定在mysql服务器启动时通过加载较早时间缓冲的相同页来自动进行缓冲池热身。innodb_buffer_pool_dump_now:立即记录缓冲池中缓冲的页。innodb_buffer_pool_load_now:通过加载一套数据页来立刻进行缓冲池热身,而非等待服务器重启。innodb_buffer_pool_dump_pct:指定每个缓冲池中读出和导出的最近被使用页的百分比。innodb_buffer_pool_load_abort:中断innodb_buffer_pool_load_at_startup或innodb_buffer_pool_load_now触发的缓冲池内容恢复进程。
温馨提示:答案为网友推荐,仅供参考