有关数据库缓存的一些点
缓存块大小
- 一般大小是一页(4K),太大会造成碎片
替换策略
- LRU(Least Recently Used),最常用
- LFU(Least Frequently Used)
缓存的性能指标
- 命中率(不要盲目追从)
- 命中率和更新率的比
-
命中的查询的执行时间(如果很小,可能性能提升不明显/甚至降低)
数据库缓存调优
- 使用绑定变量的查询方式(preparestatement),数据库会缓存SQL解析、优化结果
- 必要时可以减小缓存区大小/关闭,如果缓存命中率不高,反而造成额外开销;另外,缓存作为共享资源,竞争会降低并发度和系统性能;还有,过大的缓存,会导致数据库启动/关闭时间加长(启动后,缓存预热时间长)
- 使用buffer pool dump功能(如果有,例如MariaDB 10+),加快缓存预热
- 必要时可以使用mlock将缓存区锁定(如果支持的话)
- 异步IO/Direct IO
- 预取(prefetch)
- 缓存flush策略配置
- 段的私有缓冲区池(如Oracle)
大对象/字符串对缓存的影响
总之,数据库缓存并不是一定会提升性能(其他缓存亦是如此),使用不当反而可能降低性能。缓存引入额外的开销:查询、插入、失效、内存管理、碎片。只有经过实际的测量,不断优化配置,才能真正的达到优化目的。