mysql select缓存机制使用详解

 更新时间:2018年06月18日 12:36:35   作者:lpfuture  
这篇文章主要介绍了mysql select缓存机制使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

mysql Query Cache 默认为打开。从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过query_cache_type【0(OFF)1(ON)2(DEMAND)】来控制缓存的开关.

需要注意的是mysql query cache 是对大小写敏感的,因为Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以 任何sql语句的改变重新cache,这也是项目开发中要建立sql语句书写规范的原因吧

1. 何时cache

a) mysql query cache内容为 select 的结果集, cache 使用完整的 sql 字符串做 key, 并区分大小写,空格等。即两个sql必须完全一致才会导致cache命中。

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

c) where条件中如包含了某些函数永远不会被cache, 比如current_date, now等。

d) date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。
select * from foo where date1=current_date -- 不会被 cache
select * from foo where date1='2008-12-30' -- 被cache, 正确的做法

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

2. 何时invalidate

a) 一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。

b) 为什么不做聪明一点判断修改的是否cache的内容?因为分析cache内容太复杂,服务器需要追求最大的性能。

3. 性能

a) cache 未必所有场合总是会改善性能

当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小开销。

另外系统cache的访问由一个单一的全局锁来控制,这时候大量>的查询将被阻塞,直至锁释放。所以不要简单认为设置cache必定会带来性能提升。

b) 大result set不会被cache的开销

太大的result set不会被cache, 但mysql预先不知道result set的长度,所以只能等到reset set在cache添加到临界值 query_cache_limit 之后才会简单的把这个cache 丢弃。这并不是一个高效的操作。如果mysql status中Qcache_not_cached太大的话, 则可对潜在的大结果集的sql显式添加 SQL_NO_CACHE 的控制。
query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache

4. 内存池使用

mysql query cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 一个result set的cache通过链表把这些block串起来。因为存放result set的时候并不知道这个resultset最终有多大。block最短长度为 query_cache_min_res_unit, resultset 的最后一个block会执行trim操作。

Query Cache 在提高数据库性能方面具有非常重要的作用。

其设定也非常简单,仅需要在配置文件写入两行: query_cache_type 和 query_cache _size,而且 MySQL 的 query cache 非常快!而且一旦命中,就直接发送给客户端,节约大量的 CPU 时间。 

当然,非 SELECT 语句对缓冲是有影响的,它们可能使缓冲中的数据过期。一个 UPDATE 语句引起的部分表修改,将导致对该表所有的缓冲数据失效,这是 MySQL 为了平衡性能而没有采取的措施。因为,如果每次 UPDATE 需要检查修改的数据,然后撤出部分缓冲将导致代码的复杂度增加。

query_cache_type 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。

设置 1 代表缓冲永远有效,如果不需要缓冲,就需要使用如下语句:

代码如下

SELECT SQL_NO_CACHE * FROM my_table WHERE ...

如果设置为 2 ,需要开启缓冲,可以用如下语句:

代码如下

SELECT SQL_CACHE * FROM my_table WHERE ...

用 SHOW STATUS 可以查看缓冲的情况:

代码如下

mysql> show status like 'Qca%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_queries_in_cache | 8 |
| Qcache_inserts | 545875 |
| Qcache_hits | 83951 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 2343256 |
| Qcache_free_memory | 33508248 |
| Qcache_free_blocks | 1 |
| Qcache_total_blocks | 18 |
+-------------------------+----------+
8 rows in set (0.00 sec)

如果需要计算命中率,需要知道服务器执行了多少 SELECT 语句:

代码如下

mysql> show status like 'Com_sel%';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Com_select | 2889628 |
+---------------+---------+
1 row in set (0.01 sec)

在本例中, MySQL 命中了 2,889,628 条查询中的 83,951 条,而且 INSERT 语句只有 545,875 条。因此,它们两者的和和280万的总查询相比有很大差距,因此,我们知道本例使用的缓冲类型是 2 。

而在类型是 1 的例子中, Qcache_hits 的数值会远远大于 Com_select

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 分析一条sql的性能的标准总结

    分析一条sql的性能的标准总结

    在本篇文章里小编给各位分享了关于分析一条sql的性能的相关知识点总结内容,有兴趣的朋友们学习下。
    2019-07-07
  • 在IDEA的maven项目中连接并使用MySQL8.0的方法教程

    在IDEA的maven项目中连接并使用MySQL8.0的方法教程

    这篇文章主要介绍了如何在IDEA的maven项目中连接并使用MySQL8.0,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 浅谈sql连接查询的区别 inner,left,right,full

    浅谈sql连接查询的区别 inner,left,right,full

    下面小编就为大家带来一篇浅谈sql连接查询的区别 inner,left,right,full。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

    这篇文章主要介绍了MySQL中Innodb的事务隔离级别和锁的关系讲解教程,来自于美团技术团队的经验实际经验分享,需要的朋友可以参考下
    2015-11-11
  • MYSQL将表名称修改成大写的存储过程

    MYSQL将表名称修改成大写的存储过程

    这篇文章主要为大家详细介绍了MYSQL将表名称修改成大写的存储过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 在win10系统下安装Mysql 5.7.17图文教程

    在win10系统下安装Mysql 5.7.17图文教程

    因为想要在公司电脑上安装Mysql,于是到官网上下载了最新版本的Mysql-5.7.17,其实安装方法也很简单,下面小编把安装过程分享到脚本之家平台供大家参考
    2017-03-03
  • mysql定时自动备份数据库的方法步骤

    mysql定时自动备份数据库的方法步骤

    我们都知道数据是无价,如果不对数据进行备份,相当是让数据在裸跑,本文就介绍一下如何给mysql定时自动备份数据,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • MySql explain命令返回结果详细介绍

    MySql explain命令返回结果详细介绍

    explain 是MySql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要,这篇文章主要介绍了MySql explain命令返回结果解读,需要的朋友可以参考下
    2023-09-09
  • MySQL主从复制与读写分离的使用示例

    MySQL主从复制与读写分离的使用示例

    在企业应用中,成熟的业务通常数据量都比较大,所以需要配置多台主从数据服务器以实现读写分离,本文主要介绍了MySQL主从复制与读写分离的使用示例,感兴趣的可以了解一下
    2023-09-09
  • mysql常用命令汇总介绍

    mysql常用命令汇总介绍

    本文给大家汇总了一下mysql常用的命令行指令,包括设置更改mysqlroot密码,连接mysql等,非常的细致全面,并附上运行效果截图,希望大家能够喜欢
    2018-03-03

最新评论