关于InnoDB和MyISAM的缓冲机制

配置InnoDB的缓冲池

  • 缓冲块的管理
    InnoDB对于缓冲的管理是LRU算法
    InnoDB将所有的缓冲块都组织成一条链表,前一部分为新表,后一部分为旧表,当一块缓冲块被新加入的时候,就会插入新表与就表的交界处,也就是中间,新表的末尾,旧表的起始位置。当缓冲块被使用到的时候,就把该缓冲块移动到链表的头部。随着时间的推移,没有使用到的缓冲块就会向后移动,而末尾的缓冲块被移除,然后被回收
  • 配置参数
  • innodb_buffer_pool_size
    该参数配置分配给缓冲区的大小。InnoDB在进行每次查询的时候都会首先去查询内存里面的缓冲,如果缓冲不命中才会从磁盘里面载入数据。所以这个缓冲区越大,访问速度就越快,默认128M
  • inoodb_buffer_pool_instances
    该参数配置缓冲池的个数,默认为1。在inndb_buffer_pool_size中配置了分配的缓冲区大小之后会被分成inoodb_buffer_pool_instances个缓冲池,每个缓冲池的大小为inndb_buffer_pool_size/inoodb_buffer_pool_instances。当这个缓冲池个数越多的时候,在多线程的环境下可以减少竞争。
  • innodb_old_blocks_pct
    该参数配置旧表的位置,这是一个百分数,它决定了前百分之几是新表,后百分之几是旧表。
  • innodb_old_blocks_time
    该参数配置了当缓冲块第一次被访问时,需要等多久才移动到连表头去。默认值为0,也就是意味着,当缓冲块第一次被访问的时候就会立即被移动到表头。

配置MyISAM的缓键缓冲区

其实对于MyISAM这种直接使用了OS文件系统的引擎来说,缓冲区不需要我们太多插手的,检查缓冲是否命中,是否要从磁盘中载入数据,这都是OS自动管理的。为了处理索引文件,MyISAM维护了一个键缓冲区,用于执行给予索引的排序和检索操作,以及索引的创建和修改操作。MyISAM的缓存机制有以下几点

  • 可以使用默认的单个键缓存(某个时刻缓冲区内只存在单个键),也可以使用多个键缓存
  • 可以控制缓存总大小和缓存快大小以及缓冲区丢弃算法
  • 可以将表分配给某些特定的缓存,并且将表索引预加载到其中的某个缓存当中

使用查询缓存

查询缓存就是将曾经执行过的语句之结果缓存起来,等到再次执行这条语句的时候,就不会真正去再次执行了,而是直接从缓冲区中去除上回执行的结果来。查询缓存的几个特点

  • 某条给定的SELECT语句在第一次执行的时候,服务器会记住它执行的结果,直到下次再次遇到这条语句的时候就会直接去除结果,而不是真正再执行一遍
  • 查询缓存是以服务器接收到的字符串作为Key值的,也就意味着,当字符编码或者大小写不同的时候,查询缓存是不会按照我们期待的方式执行的
  • 如果某个值的返回结果是不确定的,也就是说在没有执行修改语句的情况下,每次查询出来的结果都是未知的,那么这个结果就不会被缓存,例如Now函数的返回值就不会被缓存,因为它会随着时间的推移而发生变化。

配置参数

  • qurey_cache_type
    该参数设置了缓存模式,可选模式如下表所示

模式

含义

0

不缓存查询结果,不检索缓存结果

1

将可缓存的结果缓存起来,除了SQL_NO_CACHE开头的以外

2

只将SQL_CACHE开头的那些查询结果缓存起来

  • query_cache_size
  • query_cache_limit
    该参数设置了查询结果集的大小限制,如果查询结果集大小大于该值,结果不会被缓存