MySQL查询缓存优化示例详析

作者:Happy_Future 时间:2024-01-27 12:21:32 

一、概述

在日常使用数据库中,80%的数据请求都是查询,而余下的20%是更新或者增加数据。如何提升查询性能,便是提高数据库处理能力的关键。

二、查询优化内容

1、查询缓存的原理

查询的路线图:

MySQL查询缓存优化示例详析

缓存SELECT操作或预处理查询的结果集和SQL语句,当有新的SELECT语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写。

2、查询缓存的优缺点

优点

不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果,提高查询性能

缺点

查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低效率查询缓存的使用,会增加检查和清理Query Cache中记录集的开销

3、不能应用查询缓存的内容

  • 查询语句中加了SQL_NO_CACHE参数

  • 查询语句中含有获得值的函数,包含:自定义函数,如:NOW() ,CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等

  • 对系统数据库的查询:mysql、information_schema 查询语句中使用SESSION级别变量或存储过程中的局部变量

  • 查询语句中使用了LOCK IN SHARE MODE、FOR UPDATE的语句,查询语句中类似SELECT …INTO 导出数据的语句

  • 对临时表的查询操作

  • 存在警告信息的查询语句

  • 不涉及任何表或视图的查询语句

  • 某用户只有列级别权限的查询语句

  • 事务隔离级别为Serializable时,所有查询语句都不能缓存

4、查询缓存相关的服务器变量

  • query_cache_min_res_unit:查询缓存中内存块的最小分配单位,默认4k,较小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,会导致碎片过多,内存不足

  • query_cache_limit:单个查询结果能缓存的最大值,单位字节,默认为1M,对于查询结果过大而无法缓存的语句,建议使用SQL_NO_CACHE

  • query_cache_size:查询缓存总共可用的内存空间;单位字节,必须是1024的整数倍,最小值40KB,低于此值有警报

  • query_cache_wlock_invalidate:如果某表被其它的会话锁定,是否仍然可以从查询缓存中返回结果,默认值为OFF,表示可以在表被其它会话锁定的场景中继续从缓存返回数据;ON则表示不允许

  • query_cache_type:是否开启缓存功能,取值为ON, OFF, DEMAND

5、SELECT语句的缓存控制

  • SQL_CACHE:显式指定存储查询结果于缓存之中

  • SQL_NO_CACHE:显式查询结果不予缓存

  • query_cache_type参数变量

  • query_cache_type的值为OFF或0时,查询缓存功能关闭

  • query_cache_type的值为ON或1时,查询缓存功能打开,SELECT的结果符合缓存条件即会缓存,否则,不予缓存,显式指定SQL_NO_CACHE,不予缓存,此为默认值

  • query_cache_type的值为DEMAND或2时,查询缓存功能按需进行,显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存

6、查询缓存相关的状态变量

show gloable status like 'Qcache%' ;

MySQL查询缓存优化示例详析

7、查询的优化的检查路线

MySQL查询缓存优化示例详析

8、命中率和内存使用率估算

查询缓存中内存块的最小分配单位query_cache_min_res_unit :

(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

查询缓存命中率 :

Qcache_hits / ( Qcache_hits + Qcache_inserts ) * 100%

查询缓存内存使用率:

(query_cache_size – qcache_free_memory) / query_cache_size * 100%

9、版本差异

在早期版本mysql均支持缓存,但是随着redis等内存型高性能的缓存技术兴起,mysql已经抛弃自己的缓存功能,mysql8.0以后不再支持缓存功能。

三、总结

MYSQL的缓存优化在早期版本可以起到一定的优化作用,最新的版本不再支持,缓存的功能而由其他的缓存服务来承担。

来源:https://blog.51cto.com/u_15131458/3241634

标签:mysql,查询,缓存优化
0
投稿

猜你喜欢

  • Python自动打印被调用函数变量名及对应值 

    2022-08-05 09:50:38
  • python解析xml文件操作实例

    2022-01-02 10:39:13
  • Python实现的扫码工具居然这么好用!

    2022-12-13 19:54:03
  • node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能

    2023-07-15 17:55:01
  • PHP使用redis实现分布式锁的示例详解

    2023-06-01 16:32:19
  • Pycharm 字体大小调整设置的方法实现

    2023-10-23 19:35:11
  • GC与JS内存泄露

    2010-09-25 19:01:00
  • Numpy中如何创建矩阵并等间隔抽取数据

    2023-01-14 16:21:16
  • golang原生实现JWT的示例代码

    2024-02-08 05:59:51
  • Python实现账号密码输错三次即锁定功能简单示例

    2023-07-22 07:40:21
  • 如何将Yolov5的detect.py修改为可以直接调用的函数详解

    2021-12-12 22:21:28
  • python连接sql server乱码的解决方法

    2023-06-27 07:25:17
  • Js中var,let,const的区别你知道吗

    2024-05-09 15:07:50
  • JavaScript中随机数方法 Math.random()

    2024-04-10 13:56:30
  •  python中字符串的常见操作总结(二)

    2023-04-08 17:17:35
  • go语言实现猜数字小游戏的方法

    2024-02-12 11:47:18
  • 基于Vue.js的表格分页组件

    2024-05-02 16:41:50
  • Python输出带颜色的字符串实例

    2023-08-20 05:28:03
  • JS简单获取并修改input文本框内容的方法示例

    2024-05-10 14:07:59
  • django框架两个使用模板实例

    2023-11-01 20:05:18
  • asp之家 网络编程 m.aspxhome.com