参考内存结构lesinnodb.pptx
Innodb内存结构第十讲
Innodb内存innodb_buffer_pool_sizeinnodb_log_buffer_sizeinnodb_additional_mem_pool_size:LRU,锁等控制信息
innodbbufferpool访问机制
innodbbufferpool链表Freelist 数据页读入bufferpool,空闲页面分配LRUlist 最近最少使用算法,剔除bufferpool数据页flushlist oldestmodification,dirtypage,flush到数据文件(异步I/O)
哈希索引与算法优点:高效访问,无需扫描btree限制:无法用于排序不支持部分索引列匹配查找无法用于范围扫描(in除外)哈希值冲突适合长度较小,cardinality较高字段仅memory引擎支持显式hashindexuser_iduser_nameemail1admin2thd3ope.cn4test
哈希索引与算法f(user_name)={ f(‘admin’)=0x1001 f(‘thd’)=0x1002 f(‘ope’)=0x1003 f(‘test’)=0x1004 }哈希值行指针0x1001指向record1的指针0x1002指向record2的指针0x1003指向record3的指针0x1004指向record4的指针
adaptivehashindex(AHI)基于hashtable必须精确匹配索引列(=,in)数据页从bufferpool中分配普通B+树定位,I/O消耗取决于树的高度何时构建? 1.page对应的buf_block-n_hash_helps大于page记录的1/16 2.btree前缀成功访问100次以上 以上两个条件同时满足,则在该page上用到的records构建AHI开启和关闭AHI innodb_adaptive_hash_index=on|off
insertbuffer插入缓冲bufferpool物理页组成部分聚集索引顺序插入vs辅助索引随机插入满足条件: 1.辅助索引 2.非唯一why?
doublewritebuffer宕机恢复损坏的页两部分:doublewritebuffer和共享表空间的doublewrite
doublewritebuffer恢复时,从共享表空间的doublewrite上找到页的副本,将其拷贝到表空间文件应用redo
innodb数据页分类SYSTEM 系统页IBUF_BITMAP insertbuffer位图INODE 索引节点IBUF_INDEX insertbuffer树叶节点INDEX B+树叶节点TRX_SYSTEM 事务系统数据UNDO_LOG undolog页FILE_SPACE_HEADER 文件页头ALLOCATED 新分配的页BLOB BLOB页UNKNOWN 未知页
innodb刷盘行为每1秒操作:不管事务是否提交,刷新logbuffer到磁盘合并insertbuffer页(I/O负载较小时)最多刷新100个bufferpool脏页到磁盘(innodb_max_dirty_pages_pct,默认90)每10秒操作:最多刷新100个bufferpool脏页到磁盘最多合并5个insertbuffer页刷新logbuffer删除无用的undo页产生一个checkpoint(fuzzy)
innodb快速关闭innodb_fast_shutdown 0:fullpurge(deleterecords)andfullinsertbuffermerge (installinnodb-plugin) 1:默认,不做上述操作,只刷新部分脏页到磁盘。fast 2:nofullpurge nofullinsertbuffermerge nodirtypageflush onlyflushredo 提交的事务不会丢失,重启后进行实例恢复
innodb实例恢复mysqldrestart…1.接受任何连接之前,应用redo,重做提交的事务 (若crash之前dirtypage被全部刷新到磁盘,跳过1)2.回滚未提交的事务3.从共享表空间读出,进行insertbuffermerge4.purge:清楚已经被标记为delete的记录以上,仅2为实例恢复特有
innodb强制恢复1.大事务操作(如altertable,批量insert)时mysqld宕机,恢复需要很长时间:2.极端情况恢复:innodb_force_recovery 1:(SRV_