查询缓存在mysql中需要注意什么?

查询缓存在mysql中需要注意什么?,第1张

查询缓存在mysql中需要注意什么?

在进入一个登录的页面时,我们的用户信息就会被软件后台记录,那么下次打开网站就能直接默认用户登录了。我们在mysql查询缓存中也有这样的使用,已经被查询的语句会放在内存,再次查询就可以直接使用。下面我们就对mysql查询缓存的一些规则以及需要注意的点进行讲解。

1.mysql查询缓存规则

  • 开启了缓存,MySQL Server会自动将查询语句和结果集返回到内存,下次再查直接从内存中取;

  • 缓存的结果是通过sessions共享的,所以一个client查询的缓存结果,另一个client也可以使用

  • MySQL Query Cache内容为 select 的结果集, cache 使用完整的SQL字符串做 key, 并区分大小写,空格等。即两个SQL必须完全一致才会导致cache命中。即检查查询缓存时,MySQL Server不会对SQL做任何处理,它精确的使用客户端传来的查询,只要字符大小写或注释有点不同,查询缓存就认为是不同的查询;

  • prepared statement永远不会cache到结果,即使参数完全一样。在 5.1 之后会得到改善。

  • where条件中如包含任何一个不确定的函数将永远不会被cache, 比如current_date, now等。

  • date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。

select * from foo where date1=current_date -- 不会被 cache
select * from foo where date1='2008-12-30' -- 被cache, 正确的做法

  • 太大的result set不会被cache (< query_cache_limit)

  • MySQL缓存在分库分表环境下是不起作用的

  • 执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的

2.查询优化注意事项

(1)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

(2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0

(3)应尽量避免在 where 子句中使用!=或<> *** 作符,否则引擎将放弃使用索引而进行全表扫描。

(4)应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20

(5)in和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3

以上就是我们在mysql查询缓存的规则以及需要注意的点,具体的原因都在上面跟大家分析过了,有需要的小伙伴可以保存到文档中便于查看。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3015658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存