mysql 缓存机制
来源:SegmentFault
2023-01-14 13:51:01
0浏览
收藏
哈喽!今天心血来潮给大家带来了《mysql 缓存机制》,想必大家应该对数据库都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到MySQL、缓存,若是你正在学习数据库,千万别错过这篇文章~希望能帮助到你!
转自:https://www.cnblogs.com/lpfut...
介绍
- mysql Query Cache 默认为打开。从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造的cache失效,会给服务器造成很大的开销,可以通过query_cache_type【0(OFF)1(ON)2(DEMAND)】来控制缓存的开关.
- 需要注意的是mysql query cache 是对大小写敏感的,因为Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以 任何sql语句的改变重新cache,这也是项目开发中要建立sql语句书写规范的原因吧
何时cache
- mysql query cache内容为 select 的结果集, cache 使用完整的 sql 字符串做 key, 并区分大小写,空格等。即两个sql必须完全一致才会导致cache命中。
- 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 (
何时更新
- 一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。
- 为什么不做聪明一点判断修改的是否cache的内容?因为分析cache内容太复杂,服务器需要追求最大的性能。
性能
-
ache 未必所有场合总是会改善性能
- 当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小开销。
- 另外系统cache的访问由一个单一的全局锁来控制,这时候大量>的查询将被阻塞,直至锁释放。所以不要简单认为设置cache必定会带来性能提升。
-
大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
缓存机制的内存使用
- mysql query cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 一个result set的cache通过链表把这些block串起来。因为存放result set的时候并不知道这个resultset最终有多大。block最短长度为query_cache_min_res_unit, resultset 的最后一个block会执行trim操作。
使用步骤
-
修改配置文件,设置query_cache_type和query_cache _size,以及query_cache_min_res_unit(可以采用默认值)
query_cache_type 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。
-
如果query_cache_type=1,如果不需要缓冲,则query如下
SELECT SQL_NO_CACHE * FROM my_table WHERE ...
-
如果query_cache_type=2,如果需要缓冲,则query如下
SELECT SQL_CACHE * FROM my_table WHERE ...
总结
- Query Cache 在提高数据库性能方面具有非常重要的作用。
- 其设定也非常简单,仅需要在配置文件写入两行: query_cache_type 和 query_cache _size,而且 MySQL 的 query cache 非常快!而且一旦命中,就直接发送给客户端,节约大量的 CPU 时间。
- 当然,非 SELECT 语句对缓冲是有影响的,它们可能使缓冲中的数据过期。一个 UPDATE 语句引起的部分表修改,将导致对该表所有的缓冲数据失效,这是 MySQL 为了平衡性能而没有采取的措施。因为,如果每次 UPDATE 需要检查修改的数据,然后撤出部分缓冲将导致代码的复杂度增加。
-
使用场景
- 写操作少于读操作;数据实时性要求较强(即不允许缓存中存在过期数据)
- 如果允许缓存中存在过期数据,可以自己使用Redis等工具进行缓存
理论要掌握,实操不能落!以上关于《mysql 缓存机制》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
关于MySQL的lock wait timeout exceeded解决方案
- 上一篇
- 关于MySQL的lock wait timeout exceeded解决方案
- 下一篇
- MySQL中utf8字符集、排序规则及utf8mb4_bin列大小写不敏感方法
查看更多
最新文章
-
- 数据库 · MySQL | 11小时前 |
- MySQL SET_VAR hint 怎样为单条查询临时调整排序内存
- 257浏览 收藏
-
- 数据库 · MySQL | 11小时前 | MySQL · utf8mb4 ·
- MySQL utf8mb4_0900_ai_ci 怎样处理重音字符比较
- 369浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL gap lock 为什么阻塞范围外的插入
- 191浏览 收藏
-
- 数据库 · MySQL | 11小时前 | MySQL · InnoDB · mysql READ COMMITTED REPEATABLE READ 一致性读 事务快照
- MySQL 一致性读为什么看不到刚提交的数据
- 499浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL JSON_UNQUOTE 怎样去掉 JSON 字符串外层引号
- 209浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL 直方图统计信息怎样帮助优化器选择计划
- 400浏览 收藏
-
- 数据库 · MySQL | 11小时前 |
- MySQL REGEXP_REPLACE 怎样清理字段中的连续空格
- 308浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL optimizer_switch derived_merge 怎样临时关闭派生表合并
- 423浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL FOR SHARE 怎样在一致性读中使用共享锁
- 389浏览 收藏
-
- 数据库 · MySQL | 12小时前 | MySQL · mysql 窗口函数 并列排名 DENSE_RANK
- MySQL DENSE_RANK 怎样保留并列排名记录
- 161浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL 隐形索引怎样安全观察删除影响
- 500浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL 降序索引怎样配合 ORDER BY 减少排序
- 121浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 769次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 766次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 847次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 817次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 646次使用
查看更多
相关文章
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- 接口返回的数据和数据库不一致怎么办?按数据生命周期排查
- 2026-06-27 398浏览
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- 关于golangtest缓存问题
- 2023-01-01 298浏览

