解析mysql 缓存如何使用内存

先说明2点
开启缓存也会带来开销,主要表现在一下方面
读取在查询开始之前必须要检查缓存
如果查询是缓存的,但是不在结果集中,那么产生结果后保存数据会带来一定的开销
向缓存写如数据也会带来开销

有的情况查询缓存不会被缓存,即使你使用 SQL_CACHE也不能缓存
主要一下几个
引用了用户自定义函数
引用了用户自定义变量
以用了存续过程
查询中包含一些实时的系统函数,比如now
引用了临时表

虽然上面说到缓存会带来一些开销
但是缓存对mysql  还是很重要
带来的好处比坏处多

下面讲一下mysql缓存如何使用内存
查询缓存的内存池被分为大小可变的块,每一个快都知道自己的大小,指向前一个和后一个逻辑块和物理块 的指针,服务器启动时初始化查询缓存使用的物理内存,内存池开始咋hi要一个快,她的大小为被配置为缓存的大小减去自身需要的40KB大小。在每次缓存查询结果时,会为查询结果分配一个缓存块,但是服务器无法估计需要缓存的结果的大小,至少会大于等于query_cache_min_res_unit,,服务器在分配时,不会再缓存中一次生成最终结果然后缓存发送到客户端,而是产生一条缓存一条,这样缓存就能保证空间不会在分配时浪费或者不足。分配内存块的速度较慢,因为服务器需要检查可用内存列表并且找打大小合适的快,因此服务器会尽量减少分配次数,当需要缓存结果时,他会构建一个大小至少为最小值的块,并且把结果放在块中,如果块已经满了,但是数据没有完整保存,那么就会产生一个新块并且保存数据,在数据存完后,如果数据块还有空隙,服务器就会剪辑数据块,并且把空间并入剩余的空间中,在其中可能产生碎片。通过紧缩,可以讲碎片空间并入有效的数据空间中。

对于事物引擎,比如innodb,事物会影响缓存,因为脏数据也会让其他引用了这块数据的缓存失效。直到该事物提交或回滚之后,这块数据才会被缓存。
query_cache_min_res_unit:the minimum size (in bytes) for blocks allocated by the query cache. The default value is 4096 (4KB)

(0)

相关推荐

  • mysql 设置查询缓存

    可将如下语句 query_cache_size = 268435456 query_cache_type = 1 query_cache_limit = 1048576 存放到/etc/my.cnf文件的[mysqld]下 然后重启mysql数据库 service mysqld restart 就会启动mysql的缓存机制Query Cache. 在使用中,查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果. 如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是

  • MySQL缓存的查询和清除命令使用详解

    Mysql 查询缓存 查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询.这样就大大提高了性能,节省时间. 1.配置查询缓存 修改配置文件,修改[mysqld]下的query_cache_size和query_cache_type(如果没有则添加).其中query_cache_size表示缓存的大小,而query_cache_type有3个值,表示缓存那种类  型的select结果集,query_cache_type各个值如下: 0

  • 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

    对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层,数据访问不可能吃得消,对于一般网站,只要具备独立的服务器,完全可以通过配置Memcache提高网站访问速度和减少数据库压力,这里主要讨论一下Memcache和MySQL数据库交互过程的流程关系,了解Memcache的中间缓存层作用,从而深入了解Memcache机制原理. Memcache和MySQL交互流程图 如上图,传统的查询方法是直接查询数据库,数据库将结果返回给查询语句,而当有Memcache中间缓存层

  • MySQL DBA教程:Mysql性能优化之缓存参数优化

    数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO.本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来进行IO优化: 一.query_cache_size/query_cache_type (global)    Query cache 作用于整个 MySQL Inst

  • 清空mysql 查询缓存的可行方法

    对一条sql进行优化时,发现原本很慢的一条sql(将近1分钟) 在第二次运行时, 瞬间就完成了(0.00sec) 这是因为mysql对同一条sql进行了缓存,服务器直接从上次的查询结果缓存中读取数据,而不是重新分析.执行sql. 可通过如下方法清空查询缓存 reset query cache;

  • mysql的查询缓存说明

    对mysql查询缓存从五个角度进行详细的分析:Query Cache的工作原理.如何配置.如何维护.如何判断查询缓存的性能.适合的业务场景分析. 工作原理 查询缓存的工作原理,基本上可以概括为:缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句:新的SELECT语句或预处理查询语句,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写: 查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:查询语句中加了SQL_N

  • MySQL优化之缓存优化

    高兴的是有博友mark了我的文章.我知道mark之后,很少会再来继续关注的.但是从侧面说明了在博友点开博客的同时,他感觉这篇博客是有价值的,是能够弥补他的知识欠缺.一篇博客最重要的是对自己有用,如果再对别人有用,那是最好的结果.我坚持写博客的目的是为了当自己遗忘知识点的时候,能够最快的找到靠谱的解决方案.当自己的归纳的知识,再记起来就会遗忘的慢一点,等时间久了,这部分知识终于化成了自己脱口而出的话,那就再也不怕遗忘了.这篇博客将继续讲MySQL的内容,这篇讲缓存优化,讲的过程也是我学习的过程.

  • 浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_stack+join_buffer_size+binlog_cache_size+tmp_table_size)*max_connectionsglobal_buffers=innodb_buffer_

  • 解析mysql 缓存如何使用内存

    先说明2点开启缓存也会带来开销,主要表现在一下方面读取在查询开始之前必须要检查缓存如果查询是缓存的,但是不在结果集中,那么产生结果后保存数据会带来一定的开销向缓存写如数据也会带来开销 有的情况查询缓存不会被缓存,即使你使用 SQL_CACHE也不能缓存主要一下几个引用了用户自定义函数引用了用户自定义变量以用了存续过程查询中包含一些实时的系统函数,比如now引用了临时表 虽然上面说到缓存会带来一些开销但是缓存对mysql  还是很重要带来的好处比坏处多 下面讲一下mysql缓存如何使用内存查询缓存

  • MySql 缓存查询原理与缓存监控和索引监控介绍

    查询缓存 1.查询缓存操作原理 mysql执行查询语句之前,把查询语句同查询缓存中的语句进行比较,且是按字节比较,仅完全一致才被认为相同.如下,这两条语句被视为不同的查询 SELECT * FROM tb1_name Select * from tb1_name 1)不同数据库.不同协议版本,或字符集不同的查询被视为不同的查询并单独缓存. 2)以下两种类型的查询不被缓存 a.预处理语句 b.嵌套查询的子查询 3)从查询缓存抓取查询结果前,mysql检查用户对查询涉及的所有数据库和表是否有查询权限

  • php查询mysql大量数据造成内存不足的解决方法

    本文实例分析了php查询mysql大量数据造成内存不足的解决方法.分享给大家供大家参考.具体分析如下: 一.问题 使用php查询mysql大数据量的时候,程序尚未执行完毕,跳出警告: Fatal error:  Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes) 错误提示:php所分配到的100M内存被占用完毕. 二.解决方法: 最简单的解决办法是:在执行文件的头部增加: ini_set('

  • 解析MySQL binlog

    一.binlog简介 binlog即binary log,二进制日志文件.它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select.show等),以事件形式记录并保存在二进制文件中. binlog主要有两个应用场景,一是用于复制,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的.二是用于数据恢复,例如还原备份后,可以重新执行备份后新产生的binlog,使得数据库保持最新状态.除去这两个主要用途外,binlog可以用于异构系统之间数据的交互

  • MySQL中Buffer Pool内存结构详情

    目录 1.回顾一下Buffer Pool是个什么东西? 1.1 增删改直接操作的是内存还是磁盘? 1.2 数据库崩溃了,内存中数据丢了怎么办? 1.3 Buffer Pool的一句话总结 2.Buffer Pool这个内存数据结构到底长个什么样子? 2.1 如何配置MySQL的Buffer Pool的大小? 2.2 数据页 2.3 磁盘上的数据页和Buffer Pool中的数据页是如何对应起来的? 2.4 缓存页描述信息 1.回顾一下Buffer Pool是个什么东西? 1.1 增删改直接操作的

  • 深入解析MySQL索引的原理与优化策略

    目录 索引的概念 索引的原理 索引的类型 索引的使用 索引的使用方式 注意事项 索引优化技巧 索引的概念 MySQL索引是一种用于加速数据库查询的数据结构,它类似于书籍的目录,能够快速指导我们找到需要的信息.MySQL索引可以根据一定的算法和数据结构进行排序和存储,从而实现高效的数据查找和访问.在数据库中,索引可以加速数据的查询和更新操作,提高系统性能. MySQL支持多种索引类型,常见的包括B-tree索引.哈希索引和全文索引等.其中,B-tree索引是最常用的一种,它是一种平衡树结构,可以将

  • 解析MySQL中存储时间日期类型的选择问题

    一般应用中,我们用timestamp,datetime,int类型来存储时间格式: int(对应javaBean中的Integer或int) 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mysql提供的时间函数 结论:适合需要进行大量时间范围查询的数据表 datetime(javaBean中用Date类型) 1. 占用8个字节 2. 允许为空值,可以自定义值,系统不会自动修改其值. 3. 实际格式储存(Just stores w

  • 深度解析MySQL启动时报“The server quit without updating PID file”错误的原因

    很多童鞋在启动mysql的时候,碰到过这个错误, 首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql.通过mysqld_safe或mysqld启动mysql实例并不会报这个错误. 那么,出现这个错误的原因具体是什么呢? 哈哈,对分析过程不care的童鞋可直接跳到文末的总结部分~ 总结 下面,来分析下mysql的服务启动脚本 脚本完整内容如下: #!/bin/sh # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Progr

  • 全面解析MySQL中的隔离级别

    数据库并发的对同一批数据进行增删改,就可能会出现我们所说的脏写.脏读.不可重复读.幻读等一系列问题.MySQL提供了一系列机制来解决事务并发问题,比如事务隔离.锁机制.MVCC多版本并发控制机制.今天来探究一下事务隔离机制. 事务是一组SQL组成的逻辑处理单元,先来看下事务的ACID特性: 原子性(Atomicity) :事务是一个原子操作单元,对数据进行修改,要么全执行要么全不执行.是从执行层面上来描述的. 一致性(Consistent) :在事务开始和完成时,数据都必须保持一致状态.是从执行

随机推荐