架构
缓冲池
* InnoBD 会在缓冲池中缓存数据页和索引,为了更加高效的对缓存数据进行管理 MySQL 团队使用了
LRU 算法的变量
* Buffer Pool LRU 算法将缓冲区按代划分,前 5/8 划分给经常被访问的数据页,后 3/8 用于缓存
最近最少被访问的数据,当有新的数据页被加载进来时会将数据页插在 5/8 之后 3/8 之前
* 当 3/8 区域中的数据页被用户读取时,Buffer Pool LRU 算法会将数据页向前移动,随着时间的推移
未被访问的数据页会被刷出缓冲区
* Buffer Pool 调优:
- Buffer Pool 默认大小为 128MB 在专用服务器上 Buffer Pool 的大小应设置为服务器内存大小
的 80%
- 将 Buffer Pool 理解为一个对象,默认实例大小为 1,在专用服务器上 Buffer Pool 的大小应设
设置为内存的平方或立方根
- Buffer Pool 所使用的数据结构是链表,每个节点的大小应为数据页的整数倍
- Buffer Pool 移动数据是慢启动的,合理设置一个窗口事件,可将真正的热点数据保留在 Buffer Pool 中
- innodb_buffer_pool_size/innodb_buffer_pool_chunk_size 应 < 1000
* 设置多个 Buffer Pool 的优点?
- 减少并发重复
- 加快查询速度(同等速度下,短跑比长跑花费的时间更少)
更改缓冲区
* Change Buffer 和 Buffer Pool 相互独立,用于缓存二级缓存页的更改
日志缓冲区
* 日志缓冲区用于存放需要被写入日志文件的数据,该缓冲区的大小由 innodb_log_buffer_size 变量
定义,默认大小为 16MB
* 日志缓冲区会定期的刷新到磁盘,对于大事务怎加缓冲区的大小可提升系统的整体性能
自适应哈希索引
* AHI 可以将 MySQL 在合适的负载和充足的内存的组合下,使系统表现的像一个内存数据库
* AHI 会自动观察经常被访问的索引页并自动为他们创建哈希索引
* AHI 是分区的,每一个索引页都被绑定到特定的分区,分区的大小默认为 8 最大为 512
在某些负载下,来自哈希索引的加速远超过哈希索引的监控和维护,在高负载下哈希索引会成为多数据库连接
争抢的源头,如大量的 join 操作,另外使用了 LIKE 运算符和 % 通配符的查询不会从哈希索引中受益,这种情况下
关闭哈希索引往往是最好的选择,最后,由于无法事先预测,在开启和关闭的情况下进行基准测试往往是最好的
方法