-->

科技资讯

您的当前位置:首页 > 资讯 > MySQL

mysql优化-缓存

2020-03-18 22:18:02  来源:admin 点击:517

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))

表有任何锁,不能使用查询缓存


相关文章更多 >

© 2024版权所有 水水网

电话:171780793