高性能Mysql读书笔记7.12.1

缓存存放在一个应用表中,通过一个哈希值应用,这个哈希值包括了如下因素,查询本身,当前要查询的数据库,客户端协议的版本等一些其他可能会影响返回结果的信息。

当判断缓存是否命中时,Mysql不会解析,“正规化”或者参数化查询语句,而是直接适用SQL语句和客户端发送过来的其他原始信息。任何字符上的不同,例如空额,注释等都会导致缓存的不命中,所以统一的编码规则是一个好的习惯。

检查缓存的时候并没有解析SQL语句,所以Mysql并不知道查询语句中是否包含不确定函数。在检查缓存之前,Mysql就做一件事情,就是通过一个大小写不敏感的检查看看SQL是不是以SEL开头。

不过也有一些问题需要注意。首先,打开查询缓存对读和写操作都会带来额外的消耗:

读查询在开始之前必须先检查是否命中缓存

如果这个读查询可以被缓存,那么当执行后,Mysql若发现查询缓存没有这个查询,会将其结果存入查询缓存,带来额外的系统消耗

这对写操作也会有影响,因为当向某个表写入数据的时候,Mysql必须将对应表的所有缓存都设置失效。如果查询缓存非常大或者碎片很多,这个操作可能带来很大的系统消耗。

虽然如此,查询缓存仍然可能给系统带来性能提升。但是,如上所述,这些额外消耗也可能不断增加,再加上对查询缓存操作是一个加锁排他操作,这个消耗可能不容小觑。

对InnoDB用户来说,事务的一些特性会限制查询缓存的使用。当一个语句在事务中修改了某个表,mysql会将这个表的 对应查询缓存都设置失效。而事实上,InnoDB的多版本特性会展示将这个修改对其他事务屏蔽。在这个事务提交之前,这个表的相关查询是无法被缓存的。所以所有在这个表上的查询——内部或者外部的事务——都只能在该事务提交后才被缓存。因此,长时间运行的事务,会大大降低查询缓存的命中率。

缓存不命中的原因:

查询语句无法被缓存,可能因为查询中包含一个不确定的函数,或者查询结果太大无法缓存。

Mysql从未处理这个查询,所以之前没缓存过

之前缓存了查询结果,但是由于查询缓存的内存用完了,Mysql需要将某些缓存逐出

数据表修改导致缓存失效

如果有大量缓存没命中,但是实际缓存了,那么原因一定如下:

查询缓存没有完成余热。Mysql没有机会将查询结果都缓存起来。

查询语句之前从未执行过。

查询语句之前从未执行过。缓存失效操作太多了。

配置和维护缓存:

query_cache_type

OFF,ON或者DEMAND,DEMAND表示只有在查询语句中明确写明了SQL_CACHE的语句才会放入查询缓存。

query_cache-size

查询缓存使用总空间,单位字节。这个值必须是1024的整数倍,否则Mysql实际分配的数据回合你指定的不同。

query_cache_min_res_unit

在查询缓存中分配内存块时最小单位。

query_cache_limit

mysql能够缓存的最大查询结果。只有当结果全部返回后,Mysql才知道查询结果是否超出限制。

query_cache_wlock_invalidate

如果某个数据表被其他的链接锁住,是否仍然从查询缓存中返回结果。默认为off。

InnoDB和查询缓存

因为InnoDB有自己的MVCC机智,所以相比其他存储过程,InnoDB和查询缓存交换要更加复杂。

关于MVCC:http://www.cnblogs.com/chenpingzhao/p/5065316.html

通用查询缓存优化:

多个小表代替一个大表可以使实效策略能够在一个更合适的粒度上进行。当然,过犹不及。

批量写入时时只要做一次缓存失效,所以相比单挑写入效率更好。(PS:不要同时做延迟写和批量写,否则可能会因为失效导致服务器僵死较长时间。)

因为缓存空间太大,在国企操作的时候可能导致服务器僵死。解决方案:控制缓存空间的大小。

无法在数据库或者表级别控制查询语句缓存,但是可以通过sql_cache和sql_no_cache来控制某个select语句是否需要进行缓存。

对于写密集型的应用来说,直接禁用查询缓存可能会提高系统的性能。关闭查询缓存可以移除所有相关消耗。

因为对互斥信号量的竞争,有时直接关闭查询缓存对读密集型的应用也会有好处。

关于缓存优化,可以做一个相关测试,对比打开和关闭查询缓存时候的性能差异。

时间: 2024-10-25 05:45:45

高性能Mysql读书笔记7.12.1的相关文章

高性能MySQL --- 读书笔记(2) - 2016/8/2

第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件.高可用的冗余系统.联机事务处理系统OLTP及很多其他应用类型. 为了充分发挥MySQL的性能,顺畅地使用它,就必须理解它的设计.MySQL的灵活性体现在很多方面,它可以再众多硬件平台上良好的配置和运行,还支持多种数据类型.不过MySQL最重要.最不同寻常的特征是它的存储引擎框架,这种架构可以讲查询处

高性能mysql读书笔记(一):Schema与数据类型优化

4.5 加快ALTER TABLE 操作的速度 原理: MySQL 的ALTER TABLE 操作的性能对大表来说是个大问题. MySQL 执行大部分修改表结构操作的方法是用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表.这样操作可能需要花费很长时间,如果内存不足而表又很大,而且还有很多索引的情况下尤其如此 特点: 大部分ALTER TABLE 操作将导致MySQL 服务中断 ALTER TABLE 本质是建新结构的表,从旧表插入数据到新表 (SHOW STATUS 显示这个语

第13章 MySQL服务器的状态--高性能MySQL学习笔记

13.1 系统变量 -- 服务器配置变量 MySQL通过SHOW VARIABLES  SQL命令显示许多系统变量. 13.2 状态变量--SHOW STATUS SHOW STATUS 命令会在一个由两列(名称/值)组成的表格里显示服务器状态变量.这些变量都是只读的. SHOW STATUS默认显示会话变量,SHOW GLOBAL STATUS显示全局变量. 也可以从INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATION_SCHEMA.SESSION_STAT

高性能javascript读书笔记(三.DOM 编程1)

第三章DOM Script DOM编程 读书笔记 访问和修改DOM元素 浏览器通常要求DOM实现和JavaScript保持相互独立. <!-- 例如IE中,被称为JScript的JavaScript实现位于库文件jscript.dll中,而DOM实现位于另一个库mshtml.dll(内 部代号Trident).这种分离技术允许其他技术和语言,如VBScript,受益于Trident所提供的DOM功能和渲染功能.Safari使用Webkit的WebCore处理DOM和渲染,具有一个分离的JavaS

高性能MySql阅读笔记第五章--创建高性能的索引1

创建高性能的索引1 索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能. 索引对于良好的性能非常重要. 索引优化应该是对查询性能优化最有效的手段了,索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能好两个数量级,创建一个真正“最优”的索引经常需要重写查询. 一.索引的类型 1.B树索引 当人们谈论索引的时候,如果没有特别指明类型,那么多半说的是B树索引,他使用B树数据结构存储数据. 可以使用B树索引的查询类型:全值匹配.匹配最左前缀.匹配列前缀.匹配范围

《C#本质论》读书笔记(12)委托和Lambda表达式

12.1. 委托概述 12.1.2 委托的数据类型 为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法.此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型--也就是委托.这里的委托类型是 ComparisonHandler .  c# 2.0之前的写法 class DelegateSample { static void Main(string[] args) { //int[] arr = { 10, 20, 30, 40, 50 }; int[] a

高性能MYSQL读书要点摘录_1_QUERY模块

1 Query Type 查询类型包含: a full table scan , index scans, range scans, unique index lookups, and constants. const  Type: 主键查询一般为Const类型 All Type : 全表扫描 2 为啥要拆分JOIN操作 Caching can be more efficient: Executing the queries individually can sometimes reduce l

CSS3秘笈读书笔记 2015/12/9

第十章.CSS的tansform\transtition\animation属性 Transform:对元素进行变形:   变换 Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束.    过度 Animation:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.可以设置多个关键贞.              动画 Transition与Animation: transition需要触发一

[head first php&amp;mysql]读书笔记-啥是php

php是一门在服务端运行的语言.为什么要有PHP呢,服务端放静态资源html,css,js,img这些不就好了吗? 但是单单有这些就太单调了.怎么要弄点交互出来,而不是天天眼巴巴地看静态的东西把,所以才有了PHP. 书上就是以一个栗子开始的,简单的说就是提交表单到后台,后台获取到数据,再运行PHP脚本,把拿过来的数据insert到数据库里,想用的时候调出来. 表单提交到后台,用$_GET或$_POST(根据form提交的method决定)通过表单名也就是name属性,再把这些数据分别放在一个变量