InnoDB|带你认识什么是MySQL的内存架构和索引说明

InnoDB|带你认识什么是MySQL的内存架构和索引说明

InnoDB架构
内存架构

  1. Buffer Pool
    主内存的一块区域 , InnoDB在表和索引数据被访问的时候缓存它 。 在专用服务器上 , 高达80%的物理内存通常分配给buffer pool 。 配置项:innodb_buffer_pool_size , 正常推荐设置50%-75%的系统内存
    实现为page链表 , 缓存里很少的数据会使用LRU算法过时掉
  2. Change Buffer
    当二级索引page不在buffer pool时 , 缓存对这些二级索引page的更改 。 对于buffer的更改 , 稍后当page被其他读操作加载进buffer pool的时候 , 会进行合并
  3. 在内存中 , change buffer占用部分的buffer pool 。 在磁盘上 , change buffer是系统表空间的一部分 , 当数据库服务器关闭的时候 , 索引得更改将在其中进行缓存
  4. Adaptive Hash Index
    自适应Hash索引 , 使InnoDB在具有适当的工作负载和有足够内存的buffer pool组合的系统上 , 执行起来更像内存中的数据库 , 而不会牺牲事务特性和可靠性 。
    根据观察到的搜索模式 , 使用索引key的前缀建立hash索引 。 hash索引是根据需要为经常需要访问的索引page构建的 。
    如果一个表差不多可以整个放进主内存 , 那么hash索引通过启用任何元素的直接查找来加快查询 , 将索引值转换为一种指针 。
  5. Log Buffer
    持有将要被写入磁盘上的日志文件的内存区域 。 log buffer的内容会定期刷写到磁盘 。 默认16MB 。 大的log buffer能让大的事务运行而不需要在事务提交前将redo log数据写到磁盘上 。 所以如果有事务更新、插入或者删除很多行 , 增大log buffer能减少磁盘IO
磁盘结构
  1. 表 Tables
  2. 索引 Indexes
    聚簇索引能加快查询 , 因为索引搜索能直接指向包含行数据的page 。 如果表很大 , 聚簇索引通常能够节省磁盘IO操作
    聚簇索引之外的其他所有叫做二级索引 。 在innodb里 , 二级索引的每个记录都包含了行的主键列 , 以及为二级索引指定的列
    如果主键key很长 , 二级索引也会使用更多的空间
    InnoDB索引是B-Tree结构 , 空间索引是R-Tree结构 。 索引记录存储在B-Tree或R-Tree的叶子page上
  3. 表空间 Tablespaces