mysql优化-缓存
2020-03-18 22:18:02 来源:admin 点击:763
1、缓存机制:
当执行相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。
2、相关命令:
select @@query_cache_type 查询缓存状态
状态值:0-Off, 1-On, 2-Demand
set session query_cache_type = demand
select @@global.query_size 缓存大小
set @@global.query_cache_size = 1048576 设置缓存大小
指定查询是否使用缓存:
select SQL_CACHE post_title,post_content from p_posts;
select SQL_NO_CACHE post_title,post_content from p_posts;
query_cache_limit 查询缓存的最大值
3、缓存命中率
show variable like '%query_cache%'; 查看缓存的相关信息
show global status like 'Qcache_hits'; 缓存命中数
Com_select com_update com_insert 统计信息
锁定状态:show global status like '%lock%';
Table_locks_waited/Table_locks_immediate 值越大,表锁导致的阻塞比较严重
Innodb_row_lock_waits
临时表:Created_tmp_disk_tables/Created_tmp_tables 低于10%
4、缓存失效的场景
4.1、不确定因素
大小写不同的SQL语句(关键词大写,保留关键字被当成字段或者条件的时候加上`` 反单引号,统一查询条件中变量的引号)
Mysql函数:now() current_date() 等
用户自定义函数:
存储函数;
临时表;
子查询、视图
预存储语句
权限不足的用户查询数据不缓存
事务隔离级别为Serializable,查询语句不缓存
局部变量不缓存
下面这些SQL语句:
SELECT .... IS NULL
SELECT ... INTO OUTFILE(DUMPFILE)
SELECT ... FOR UPDATE
SELECT ...IN SHARE MODE
查询缓存会消耗系统的I/O,会给服务器增加额外的负担。
5、怎么优化查询缓存(提供缓存命中率)
5.1、通过分区表提高缓存命中率,设计数据库的时候使用多个小表
5.2、尽量执行一次性写入操作
5.3、使用demand(query_cache_type ),通过SQL_CACHE来决定是否使用缓存
5.4、基于数据库连接来设置或者运行缓存
5.5、对于写操作非常频繁的表不需要使用查询缓存(query_cache_size=0)
5.6、对于innodb存储引擎
Innodb_buffer_pool (数据库索引和表数据)
Innodb_buffer_pool_read_requests 读的次数
Innodb_buffer_pool_reads 从磁盘中读取的次数
(Innodb_buffer_pool_read_requests-Innodb_buffer_pool_reads)/Innodb_buffer_pool_read_requests = 命中率
有数据的缓存页数 Innodb_buffer_pool_pages_data
缓存页面的总数量 Innodb_buffer_pool_pages_total(65535)16K=8M
没有被使用的缓存页数 Innodb_buffer_pool_pages_free 数字越大,调小内存,
数字越少,增大内存(innodb_buffer_pool_size、默认8M(8388608))
表有任何锁,不能使用查询缓存