帝国cms优化mysql_优化体系--mysql数据库查询缓存总结

一、缓存条件,原理

MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query Cache来查找结果(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同,即使完全相同的SQL,如果使用不同的字符集、不同的协议等也会被认为是不同的查询而分别进行缓存)。它不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘IO和CPU运 算,所以有时候效率非常高。

查询缓存的工作流程如下:

1:命中条件

缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.

如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的

2:工作流程

服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)

如果找到了缓存,则直接返回缓存(性能提升)

如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.

执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)

二、相关SQL语句

2.1、查看SQL缓存参数:show variables like '%query_cache%';

adcfc3cb37441c63246de389cbd269d3.jpg

其中各个参数的意义如下:

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。 Qcache_free_memory:缓存中的空闲内存。 Qcache_hits:每次查询在缓存中命中时就增大 Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。 Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况) Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。 Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。 Qcache_total_blocks:缓存中块的数量。

2.2、开启SQL缓存:set global query_cache_type = 1;

2.3、关闭SQL缓存:set global query_cache_type = 0;

2.4、设置缓存空间:set global query_cache_size = 1024*1024*64 (64M)

2.5、固定SQL语句声明不适用缓存:select sql_no_cache * from 表名

注意:改变SQL语句的大小写或者数据表有数据改动,则不会调用缓存。

2.6、配置查询缓存

vi /etc/my.cnf

query_cache_size=300M query_cache_type=1

6ab6ebbef258ff2103fa86a20219ee67.jpg

三、清楚缓存

mysql的FLUSH句法(清除缓存)

FLUSH flush_option [,flush_option]

如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。

flush_option可以是下列任何东西:

HOSTS 这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于 max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。 LOGS 关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。 PRIVILEGES 这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。 TABLES 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。 FLUSH TABLES WITH READ LOCK 关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。 STATUS 重置大多数状态变量到0。 MASTER 删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge 操作。 QUERY CACHE 重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不一样的。 SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。

一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。

四、缓存的内存管理

缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中有大概40K的空间是用来维护缓存的元数据的,例如空间内存,数据表和查询结果的映射,SQL和查询结果的映射等.

MySQL将这个大内存块分为小的内存块(query_cache_min_res_unit),每个小块中存储自身的类型,大小和查询结果数据,还有指向前后内存块的指针.

MySQL需要设置单个小存储块的大小,在SQL查询开始(还未得到结果)时就去申请一块空间,所以即使你的缓存数据没有达到这个大小,也需要用这 个大小的数据块去存(这点跟Linux文件系统的Block一样).如果结果超出这个内存块的大小,则需要再去申请一个内存块.当查询完成发现申请的内存 块有富余,则会将富余的空间释放掉,这就会造成内存碎片问题,见下图

b722a8a996d800c6366ddc0844b10b7d.jpg

此处查询1和查询2之间的空白部分就是内存碎片,这部分空闲内存是有查询1查询完以后释放的,假设这个空间大小小于MySQL设定的内存块大小,则无法再被使用,造成碎片问题

在查询开始时申请分配内存Block需要锁住整个空闲内存区,所以分配内存块是非常消耗资源的.注意这里所说的分配内存是在MySQL初始化时就开辟的那块内存上分配的.

五、缓存的使用时机 & 性能

衡量打开缓存是否对系统有性能提升是一个很难的话题

1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)

2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

3. 通过命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

任何事情过犹不及,尤其对于某些写频繁的系统,开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。原因是MySql为了保证Query Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。

六、查询缓存问题分析

aa753aa97a18ca892a182f7da412b2d6.jpg

分析和配置查询缓存

总结

这里要注意Query Cache因MySql的存储引擎不同而实现略有差异,比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
08CMS程序代码完全开源,个人网站可以永久免费使用。 08CMS 拥有独特设计的处理内核,稳定高效,数据容纳能力强。100%自定义文档模型与附属信息模型,独家 N体系 X N层 类目结构,类目可通用于全站文档与合辑,不同模型间相互联系,全站统一管理,允许不同模型混合调用,设计精巧的合辑体系,让您打造天然浑成的真正的综合网站。 08CMS 基于PHP MYSQL设计,支持跨平台(Windows、Linus、Unix)应用。 100% 自定义文档模型,支持文章、Flash(集)、图片(集)、视频(集)、下载(集)、网店、问吧、交互信息等模型,自定义内容搜索,多模型文档混排。 体系级自定义的多维类目结构,独家实现 N体系 X  N层 的无限自由类目。原始类目可组合衍生出交叉子类,并为其布署类目页面及Url。允许多重频道共存,类目结构统一设置,对全站所有文档及合辑通用。 自定义合辑体系及合辑封面模型,合辑允许相互嵌套,允许以全站类目体系进行分类,产生类目内的合辑列表。支持内容、属性、连载等合辑。 自定义附属信息模型,可生成公告、广告、单页、友链、咨询、留言等模型,支持发布付费、权限控制、有限展位排队等功能。 支持页面静态与缓存,可自选内容进行动态调用、部分更新、二级缓存。 模板标识界面化设置,模板标识查询及标识地图让模板设计更加轻松自如。 完善灵活的交互设置中心、内容审核流程、审后控制流程。自主设置文档管理手段,如推荐、精品、焦点、置顶、标题加黑(粗)等。
鸿鹄智能云CMS站群系统是一个在centos7.x 系统中,以python+Mysql进行开发的cms站群系统。 一.环境要求 鸿鹄智能云站系统版本是基于centos7开发的,务必使用centos7.x 系统 (裸系统即可/一般情况下不会有问题) 二.安装命令 SSH登陆你的服务器,ROOT用户权限下执行: yum install -y wget && wget -O install.sh http://download.swanyun.com/version/install.sh && sh install.sh (*)注意:部分服务器系统yum陈旧,如报yum错请先执行 yum update 更新一下完成后执行上述命令 三.登陆管理 安装完成后面板有提示,请注意(复制保存以防您忘记) 鸿鹄智能云CMS站群系统系统特性: 1、一键批量建站(快) 填写好域名后可一键批量创建站点,简单易用,速度飞快,只需要做三件事:解析域名,批量添加网站,等待30分钟站点自动建好,而且还带高质量的内容。 速度:一分钟建立一个站点(包含高质量内容),30分钟1000+站点,飞一般的速度! 2、一键调度数据(免规则免采集) 我们的云端数据提供内容高度精准调度服务,包括内容标题、内容主体、内容质量度、行为模式等分析,通过关键字自动调取相关内容! 数量:站点需要什么数据我们就能为您提供什么数据,不是采集! 栏目数*更新量 质量:标题唯一性  内容主题集中度 页面相关内容 地区内容 图文混版 3、SEO自动化功能(内置) 前端SEO模版优化适用于目前主流的搜索引擎,MIP/AMP/H5,OG协议,XML文件,网站地图SITEMAP不用自己写都有!自动ping,主动推送提交URL,404自定义等! 基础:通用SEO基础代码功能,页面关键字密度控制 自动内链 高级:URL自定义 404高级功能 SSL 数据分析 4、高性能并发负载(稳) 我们采用了python高并发框架系统构建底层源码结构,提升整体高并发负载性能,异步模式解决调用阻塞问题,前端展现毫秒级响应,单网站承载千万级别内容数据轻松应对,成功通过高压力测试! 代码:Python  数据库:Mysql 缓存组:Redis  WEB服务器:鸿鹄WEB服务器 5、商业SEO模版(选) 我们提供的模版自动适应各种浏览设备,同时针对搜索引擎做了深度优化,模版自身修改也简单易用,HTML前端SEO优化代码无需用户担心,模版内置多个模型调用标签,可以轻松为网站前端植入广告代码、表单代码、统计代码、在线客服等! 特性:自适应 MIP/AMP/H5 扩展:模版分离 易于编写 6、超多自定义功能(唯一性) 为每个网站提供差异化自定义功能,您可以对网站中的任意一个站做个性化修改(包含栏目URL,内容页URL都可自定义),而且针对网站模板的任何地方都能修改,内容调度可以完全模拟正常人工发布内容! 7、API一键获取数据(关键字) 支持多种格式数据返回格式,商业展现各种数据关联性,兼容多种CMS一键接入,提供多种数据文件格式离线下载,数据云端每日更新! 接口:主关键字 长尾词提取 相关词提取 关联标题内容/图片提取 8、傻瓜化但与众不同(一键模式) 云端调度模式解决您最关心的企业营销问题,建站、优化、维护、运营、分析,客户需要的技术支持我们都全力提供服务! 传统:找人,写源码,改需求,发布内容,SEO优化,运维 我们:安装,点鼠标设置,喝茶,看数据分析,上排名流量!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值