非活跃数据多的情况下首先考虑开启缓存
1、开启查询缓存
根据MySQLServer的架构图可以看出,当执行一条sql语句的时候,命令分发器会先去查询缓存模块中查取缓存,如果有缓存值,则直接返回缓存值,如果不存在缓存值,再向下查询。
1.1 查看是否开启
所以首先开启缓存是优化的第一件事情(默认关闭),使用下面命令查看缓存是否开启
show variables like '%query_cache%';
查询结果如下:
说明:
have_query_cache:是否支持Query Cache
query_cache_limit:Query Cache 存放的单条Query 最大Result Set ,默认1M
query_cache_min_res_unit:Query Cache 每个Result Set 存放的最小内存大小,默认4k
query_cache_size:存放Query Cache 内存的大小
query_cache_type:是否开启Query Cache
query_cache_wlock_invalidate:当有写锁时,Query Cache是否还有效
1.2 开启
开启查询缓存的操作:
(windows系统)
打开my.ini文件,修改
query_cache_type=1
query_cache_size=20M
然后重启mysql服务器(MySQL在windows下启动关闭)
(linux系统)
执行
vi /etc/my.cnf
增加配置
query_cache_size = 20M
query_cache_type = ON
然后重启mysql服务器
重启命令
service mysql restart
再次查看确认开启
1.3查看缓存的使用情况
使用命令
show status like 'qcache%';
返回使用情况
Qcache_free_blocks:缓存中相邻内存块的个数,如果数量大说明可能有碎片
Qcache_free_memory:空闲内存
Qcache_hits:缓存命中次数
Qcache_inserts:查询的次数,相同的查询语句不增加此项个数
Qcache_lowmem_prunes:由于内存的问题,没有进入cache的查询次数,如果数量很大,需要考虑增加缓存大小和清理部分缓存
Qcache_not_cached:没被缓存的查询次数,如果查询语句不想进入缓存,可以使用此命令
select SQL_NO_CACHE * from users;
Qcache_queries_in_cache:从缓存中返回数据的查询的次数
Qcache_total_blocks:当前缓存中内存块的总数
1.4缓存清理
缓存中的碎片整理
flush query cache;
清除缓存
reset query cache;
参考资料:
《MySQL性能调优与架构设计》
https://blog.csdn.net/chen_xiaoqi/article/details/103934789