合理配置Mysql缓存,提高缓存命中率
众所周知,从内存中读取要比从硬盘上速度要快好几百倍。故而,现在绝大部分应用系统都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率。
首先打开mysql 命令端:
输入 show variables like '%query_cache%';
其中:
have_query_cache
表明当前版本支持缓存功能,你会发现是它的值是YES。不要以为是yes就代表开启了查询缓存,实际上不是的。该参数表示当前版本的mysql是否支持query cache,实际上是否开启查询缓存是看另外下面两个参数的值。
-
query_cache_size
, 该值默认单位为byte,即字节。该值默认为0,表明不开启。改了后表明开启。为缓存的大小。具体设置为多大,取决于实际情况,但是最好设置为1024的倍数,参考值32M。 -
query_cache_type
query_cache_type=0(OFF)禁用cache
query_cache_type=1(ON)缓存所有结果,除非select语句使用SQL_NO_CACHE禁用查询缓存
query_cache_type=2(DEMAND),只缓存select语句中通过SQL_CACHE指定需要缓存的查询
一、什么时候应用系统会从缓存中获取数据?
数据库从服务器上读取数据时,可以从硬盘的数据文件中获取数据,也可以从数据缓存中读取数据。那在什么情况下,系统是从缓存中读取数据,而不是从硬盘的数据文件中读取数据?
简单的说,数据缓存就是内存中的一块存储区域,它存储了用户的sql文件以及相关查询。通常情况下,用户下次查询时,如果使用的sql文本是相同的,并且自从上次查询后,相关的记录没有被更新过,此时数据库就直接采用缓存中的内容。从这个原则,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件。
1.所采用的sql文本是相同的
当前后两次用户使用了相同的sql语句(假设不考虑其他条件,控制变量法),则服务器会从缓存中读取,而不需要再去解析和执行sql语句。这里的sql文本必须一字不差的完全相同。select后面的字段名称(大小写不敏感)和数量都要求一致。where条件也是一致的。
2.要满足两次查询之间,数据记录包括表结构都没有更改过
如果记录所在的表更改了,比如增删字段。或者是insert都是不行。
3.客户端与服务器之间的字符集要一致
这里强调是一致,不是兼容!
二、提高缓存命中率的建议
从上面的条件可以卡出,想要使用缓存,条件相对比较严格。其实也是合情合理的,主要是为了保障数据的一致性。
- 1.客户端与服务器端使用相同的字符集
- 2.在客户端上,要固化查询的sql语句
- 3.在条件允许的情况下,提高内存的缓存配置
- 4.通过分区分表,读写分离,来避免数据与数据之间的干扰
- Spring Cloud(一)服务的注册与发现(Eureka)
- Shard 分片集群
- 面试官最爱的volatile关键字
- 玩转 WebView ,突破系统限制,让缓存更简单,更灵活
- Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用
- 50道Java线程题
- Jrebel6.3.3破解,配置图文教程
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
- Keras中带LSTM的多变量时间序列预测
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
- Hibernate 的性能优化的时候碰到了"抓取策略",有四种
- 基于 Spring Cloud 完整的微服务架构实战
- maven build时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
- Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法
- Ubuntu 安装cuda10.1驱动的实现步骤
- Android单例模式的几种方法总结
- android长截屏原理及实现代码
- Android 删除指定包名的App实例代码
- 在Ubuntu20.04 LTS中配置Java开发环境
- Android 加载GIF图最佳实践方案
- Android编程之方向传感器用法示例
- Ubuntu20.04安装cuda10.1的步骤(图文教程)
- Android的WebView与H5前端JS代码交互的实例代码
- Android 图片缓存机制的深入理解
- Ubuntu18.04安装Nvidia显卡驱动教程(图文)
- Android控件Spinner的使用方法(1)
- 学习使用Material Design控件(四)Android实现标题栏自动缩放、放大效果
- Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)