
正文
mysql缓存池怎么样 mysql缓存大小设置
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
mysql 设置缓存有什么用
我们都知道 MySQL 的 Table Cache 是表定义的缓存,江湖上流传着各种对这个参数的调优方法。
table cache 的作用,就是节约读取表结构文件的开销。对于table cache 是否命中,其实table cache 是针对于线程的,每个线程有自己的缓存,只缓存本线程的表结构定义。不过我们发现,strace 中没有关于表结构文件的 open 操作(只有 stat 操作,定位表结构文件是否存在),也就是说 table cache 不命中,不一定需要读取表结构文件。这种感觉好像是:在不命中 table cache 时,命中了另外一个表结构缓存。
运维建议:
我们读一下 MySQL 的文档,关于 table_open_cache 的建议值公式:建议值 = 最大并发数 * join 语句涉及的表的最大个数。
通过实验我们容易理解:table_cache 是针对于线程的,所以需要最大并发数个缓存。另外,一个语句 join 涉及的表,需要同时在缓存中存在。所以最小的缓存大小,等于语句 join 涉及的表的最大个数。将这两个数相乘,就得到了 MySQL 的建议值公式。
相关问答
Q1: mysql 缓冲池 设置 多大
innodb_buffer_pool_instances 参数,将 buffer pool 分成几个区,每个区用独立mysql缓存池怎么样的锁保护,这样就减少mysql缓存池怎么样了访问 buffer pool 时需要上锁的粒度,以提高性能。准备一个空数据库,在这里mysql缓存池怎么样我们将 performance_schema_events_waits_history_long_size 调大,是为了让之后实验数据能采集的更多,在此不多做介绍。使用 sysbench,准备一些数据,
对数据进行预热 60s,可以看到预热期间的性能会不太稳定,预热后会比较稳定,
设置 performance_schema,这次我们将仅开启观察项(生产者)hash_table_locks,并开启 waits 相关收集端(消费者)。(相关介绍参看 实验 03)
为什么我们知道观察项应该选择 hash_table_locks?在 performance_schema.setup_instruments 表中,列出了所有观察项,但我们很难从中选出我们应观察哪个观察项。这时候,可以将所有观察项都启用,然后设计一些对比实验,比如使用几种不同的 SQL,观察这些操作影响了哪些观察项,找到共性或者区。还有一种高效的方式是搜索别人的经验,或者阅读 MySQL 源码。本例中 hash_table_locks 隐藏的比较深,使用了阅读 MySQL 源码和对比试验结合的方法。
Q2: mysql有基于LRU缓冲池,其它辅助缓存如memcached和redis的意义应该就不需要了,还是有其它需要的理由?
1、首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是数据库操作上,再继续往下看。
2、明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等,redis要自己去实现分布式缓存(貌似最新版本的已集成),自己去实现一致性hash。因为不知道应用场景,不好说一定要用memcache还是redis,说不定用mongodb会更好,比如在存储日志方面。
3、缓存量大但又不常变化的数据,比如评论。
4、思路是对的,清晰明了,读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。
5、考虑是否需要主从,读写分离,考虑是否分布式部署,考虑是否后续水平伸缩。
6、想要一劳永逸,后续维护和扩展方便,那就将现有的代码架构优化,按你说的替换数据库组件需要改动大量代码,说明当前架构存在问题。可以利用现有的一些框架,比如SpringMVC,将应用层和业务层和数据库层解耦。再上缓存之前把这些做好。
7、把读取缓存等操作做成服务组件,对业务层提供服务,业务层对应用层提供服务。
8、保留原始数据库组件,优化成服务组件,方便后续业务层灵活调用缓存或者是数据库。
9、不建议一次性全量上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换至核心业务。
10、刷新内存,以memcached为例,新增,修改和删除操作,一般采用lazy load的策略,即新增时只写入数据库,并不会马上更新Memcached,而是等到再次读取时才会加载到Memcached中,修改和删除操作也是更新 数据库,然后将Memcached中的数据标记为失效,等待下次读取时再加载。
大方向两种方案:
1、脚本同步:自己写脚本将数据库数据写入到redis/memcached。这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。
2、业务层实现:先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。
mysql缓存池怎么样的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql缓存大小设置、mysql缓存池怎么样的信息别忘了在本站进行查找喔。








