在mysql服务器高负载的情况下,必须采取一种措施给服务器减轻压力,减少服务器的I/O操作。一般采用的方法是优化sql操作语句,优化服务器的配置参数,从而提高服务器的性能。Mysql使用了几种内存缓存数据的策略来提高性能。

一、mysql的缓存机制

Mysql缓存主要包括关键字缓存(key cache)和查询缓存(query cache),这主要讲解mysql的查询缓存(query cache)机制。

1.查询缓存概述

在mysql的性能优化方面经常涉及到缓冲区(buffer)和缓存(cache),mysql通过在内存中建立缓冲区(buffer)和缓冲(cache)来提高mysql性能。对于innodb数据库,mysql采用缓冲池(buffer pool)的方式来缓存数据和索引;对于mylsam数据库,mysql采用缓存的方式来缓存数据和索引。

Mysql查询缓存机制(query cache)简单的说就是缓存sql语句及查询结果,如果运行相同的sql,服务器直接从缓存中提取结果,而不是再去解析和执行sql。而且这些缓存能被所有的会话共享,一旦某个客户端建立了查询缓存,其他发送同样sql语句的客户端也可以使用这些缓存。

如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存值得相关条目被清空。更改的是表中任何数据或是结构的改变,包括insert、update、delete、truncate、alter table、drop table或drop database等,也包括哪些映射到改变了表的使用merge表的查询。显然,这对于频繁更改的表,查询缓存是不合适的,而对于一些不常改变的数据且有大量相同sql查询的表,查询缓存会节约很大的性能。

查询必须是完全相同的(逐字节相同)才能够被认为是相同的,字符的大小也被认为是不同的。另外,同样的查询字符由于其他原因可能认为是不同的。使用不同的数据库,不同的协议版本或者不同默认字符字符集的查询被认为是不同的查询并且分别进行缓存。

2.mysql查询缓存的工作原理

当mysql收到传入的sql语句时,它首先和先前已经解析过的sql语句进行比较,如果发现相同,则返回已缓存数据。一定是完全相同。下面两个是不同的:

01 SELECT 课程名FROM KC;

02 select 课程名from kc

因为大小写的缘故,两条sql语句被认为是不同的,他们的缓存是不能共享的。另外,如果一条sql语句是另外一条sql语句的子串,类似下面的情况,第02行的语句不会被缓存;如果sql语句是存储过程、触发器或者事件内部的一条语句,同样也不会被缓存。查询缓存也受到权限的影响,对于没有权限访问数据库中数据的用户,即使输入了同样的sql语句,缓存中的数据也会无权访问。

01 SELECT 课程名FROM KC where学分in(

02 SELECT 学分FROM KC

03 );

当传入的sql语句被认为是存在缓存的情况下,系统会修改mysql的一个状态变量Qcache_hits,并将其值增加1,可以运行语句来查看qcahce_hits的值,如下:

mysql> show status like '%qcache_hits%';+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Qcache_hits | 0 |

+---------------+-------+

1 row in set (0.00 sec)

上述表中,Qcache为0,表示目前缓存的命中率为0,一旦缓存生效,该值大于1。例如,先输入如下的sql语句:

01 select * from kc;其值增加1

以下这些形式的查询不会缓存。

l Select ...... Lock in share mode

l Select ...... For update

l Select ...... Into outfile ...

l Select ...... Into dumpfile

l Select * from ... Where autoincrement_col is null

3.查看mysql的缓存信息

默认情况下mysql的查询缓存是被打开的,可以通过查询mysql的系统变量来查看mysqld是否支持缓存,输入下面命令:

mysql> show variables like 'have_query_cache';+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| have_query_cache | YES |

+------------------+-------+

1 row in set (0.00sec)

mysql> show status like '%qcache_cache%';

Emptyset (0.00sec)

mysql> show status like '%qcache%';+-------------------------+-------+

| Variable_name | Value |

+-------------------------+-------+

| Qcache_free_blocks | 0 |缓存空闲的内存块| Qcache_free_memory | 0 |在query_cache_size设置的缓存中的空闲的内存| Qcache_hits | 0 |缓存的命中次数| Qcache_inserts | 0 |查询缓存区此前总共缓存过多少条查询命令的结果| Qcache_lowmem_prunes | 0 |查询缓存区已满而从其中溢出和删除的查询结果的个数| Qcache_not_cached | 0 |

| Qcache_queries_in_cache | 0 |

| Qcache_total_blocks | 0 |缓存总的内存块+-------------------------+-------+

8 rows in set (0.00 sec)

二、mysql查询缓存的配置和使用

1.配置查询缓存

查询缓存的配置可以通过设置系统环境变量来完成,设置环境变量一般有两种方式:一种是配置文件中配置;另外可以在命令行中配置。

Vim /etc/my.cnf

Query_cache_type可以是0,1,2,0代表不使用缓存,1代表使用缓存,2代表根据需要使用

2.使用查询缓存

3.查询缓存的维护

在使用查询缓存时,可以通过have_query_cache来查看当前服务器是否支持查询缓存,

mysql> show variables like 'have_query_cache';+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| have_query_cache | YES |

+------------------+-------+

Yes表示支持

当查询缓存工作一定时间后,通过show status来监控缓存的性能

mysql> show status like '%qcache%';+-------------------------+-----------+

| Variable_name | Value |

+-------------------------+-----------+

| Qcache_free_blocks | 1 |

| Qcache_free_memory | 268414376 |

| Qcache_hits | 0 |

| Qcache_inserts | 2 |

| Qcache_lowmem_prunes | 0 |

| Qcache_not_cached | 3 |

| Qcache_queries_in_cache | 2 |

| Qcache_total_blocks | 7 |

+-------------------------+-----------+

查询缓存会生成碎片,可以通过下面命令来清理碎片

mysql>flush query cache;

Query OK,0 rows affected (0.00sec)

如果想清理内存中的碎片:

mysql>reset query cache;

Query OK,0 rows affected (0.00sec)

两个命令同时使用,彻底清理碎片。

mysql 缓存区_Mysql缓存的配置和使用相关推荐

  1. mysql是否有缓存区_Mysql查询高速缓存区

    为了提高查询速度,Mysql会维护一个内存区域(官方文档指出,大小至少41984B)对查询结果进行缓存,当查询时发现缓存区里有数据则直接返回结果而不用去执行sql语句. 查询命中的条件 每个缓存查询至 ...

  2. mysql 缓存监控_MySql 缓存查询原理与缓存监控 和 索引监控

    MySql缓存查询原理与缓存监控 And 索引监控 by:授客 QQ:1033553122 查询缓存 1.查询缓存操作原理 mysql执行查询语句之前,把查询语句同查询缓存中的语句进行比较,且是按字节 ...

  3. mysql 从库_mysql数据库主从配置

    在一篇文章<离线安装mysql数据库>,讲解了离线安装mysql数据库的过程,本文将讲解mysql数据库的主从配置方法.mysql数据库进行主从配置后,可以实现数据库的备份.同时应用也可以 ...

  4. mysql常用缓存技术_Mysql缓存技术

    Mysql缓存特征MysqlL查询缓存机制是MySQL数据库中的重要机制之一 缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql Mysql缓存适 ...

  5. linux mysql互为主从_mysql互为主从配置(双主模型)

    一.A.B双主模型的实现条件: 1. 开启二进制日志 2. 开启中继日志 3. 解决自动增长列的问题 如果A服务器上自动增长的列编号有一个35,此时还没有同步到B服务器上,在B服务器上插入一条数据,编 ...

  6. mysql内存数据库性能_Mysql内存表配置及性能测试

    centos7 mysql数据库安装和配可以参考一下文章,基本照做就可以了(我选的方法二): http://www.cnblogs.com/starof/p/4680083.html 说到内存表,首先 ...

  7. mysql 从备份_MySQL主从备份配置

    主库配置: Windows环境:找到my.ini配置文件(我默认安装的路径在C:\ProgramData\MySQL\MySQL Server 5.7),确保[mysqld]下有server-id=1 ...

  8. mysql推荐内存_MySQL大内存配置方案 如my-medium.ini、my-huge.ini等

    MySql noinstall-5.1.xx-win32 配置(原创) 1.解压mysql-noinstall-5.1.xx-win32.zip 到你喜欢的目录,例如:d:\php\mysql 2.在 ...

  9. mysql密码参数_MySQL 密码参数配置与修改 validate_password

    MySQL 密码参数配置与修改 validate_password 场景 通过root用户创建travel_agency数据库,目标是,新建一个用户然后对仅对该用户开放travel_agency数据库 ...

最新文章

  1. android oppo调试模式,OPPO A59 开启USB调试模式
  2. 压缩感知(II) A Compressed Sense of Compressive Sensing (II)
  3. oracle 信用检查,Oracle EBS 信用(Credit)额度(1)-基础设置
  4. 成功解决AttributeError: module 'tensorflow' has no attribute 'merge_all_summaries'
  5. boost::hana::detail::has_duplicates用法的测试程序
  6. php清空dns缓存文件,dns清空-windows刷新本地DNS缓存的几种方法
  7. c语言五子棋卡死,五子棋程序出错了
  8. Codeforces Round #441 D. Sorting the Coins(模拟)
  9. 电脑知识:电脑如何连接电视,在电视上显示?
  10. Kafka概念和基本架构概述
  11. 把chord下dbm_noauth做成静态库,提供接口
  12. Super Jumping! Jumping! Jumping! 最长上升子序列+DP
  13. 机房智能直冷优化应用技术
  14. 公众号 html5页面,微信公众号添加h5页面模板的操作方法是什么?
  15. uygurqa输入法android,uygurqa维语输入法2021
  16. 匿名mahony互补滤波代码详解
  17. 青少年c语言培训,青少年信息学奥赛培优教程·入门篇(2020年01月)
  18. ILSVRC2012神经网络训练图像预处理
  19. XSS.haozi.me刷题
  20. 树莓派3B安装openwrt19.07.04

热门文章

  1. 千亿级携程酒店AWS实践
  2. 面试题:mysql 一棵 B+ 树能存多少条数据?
  3. 如何实现一个连接池?一文带你深入浅出,彻底搞懂!
  4. 精心为你准备的最全的20道Mysql面试题。
  5. 交易中台架构设计:海量并发高扩展,新业务秒级接入
  6. 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
  7. 35岁不是程序员的坎儿,看不清楚这件事才是!
  8. 一文完全理解定时器实现技术
  9. HR吐槽BAT员工:不要把平台的光环当成自己的,我们需要造火箭的。
  10. 这51个大数据术语,你懂的有几个?