`

MySQL查询缓存与执行计划

阅读更多

PS:原创文章,如需转载,请注明出处,谢谢!     

本文地址:http://flyer0126.iteye.com/blog/1331500

 

一、MySQL查询缓存

      查询缓存存储SELECT 查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。

注意 :1. 查询缓存不返回旧的数据。当表更改后,查询缓存值的相关条目被清空。

        2. 如果你有许多mysqld 服务器更新相同的MyISAM 表,在这种情况下查询缓存不起作用。

        3. 查询缓存不适用于服务器方编写的语句。

##环境信息
#Mysql Version:5.5.9
#Server:Windows 7

##查询数据信息示例:

select * from users where id = 523402;
#Query time:0.008s

##重复执行一遍
#Query time:0.001s

SELECT * FROM users WHERE id = 523402;
#Query time:0.013s

##重复执行一遍
#Query time:0.001s

##总结:大小写不一致时MySQL查询解析时会认为查询缓存不一致,查询必须是完全相同的(


逐字节相同)


才能够被认为是相同的
 

 

(1). #通过have_query_cache服务器系统变量指示查询缓存是否可用
SHOW VARIABLES LIKE 'have_query_cache';

 

 

(2)#查询缓存系统变量信息
SHOW VARIABLES LIKE 'query_cache%';

 

二、MySQL执行计划

 

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上explain就可以了:
如:explain select * from test1
EXPLAIN列的解释:
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MYSQL认为必须检查的用来返回请求数据的行数
Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
extra列返回的描述的意义
Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
system 表只有一行:system表。这是const连接类型的特殊情况
const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
range:这个连接类型使用索引返回一个范围中的行,比如使用>或查找东西时发生的情况

index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描

 

  • 大小: 11.3 KB
  • 大小: 13.7 KB
分享到:
评论

相关推荐

    mysql查询缓存

    MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升...

    MySQL 执行过程与查询缓存1

    MySQL 执行过程与查询缓存是数据库操作中的关键环节,理解这一过程对于优化数据库性能至关重要。MySQL 的执行流程包括以下几个步骤: 1. **客户端发送查询**:当用户通过MySQL客户端发送一条SQL查询时,这个请求会...

    释放查询潜力:深度配置MySQL查询缓存

    此命令会列出所有与查询缓存相关的系统变量及其当前值,有助于评估查询缓存的使用情况。 ##### 缓存失效与刷新 查询缓存会在以下几种情况下失效: - 数据表更新(如 INSERT、UPDATE、DELETE 操作)时,所有涉及该...

    MySQL缓存研究

    2. MySQL缓存研究内容与目的 研究MySQL缓存主要关注以下几个方面: - 查询缓存的配置与优化,如何根据工作负载调整缓存大小,以及何时关闭查询缓存。 - InnoDB缓冲池的管理和调整,包括缓冲池的大小、脏页策略以及...

    Mysql 缓存

    查询缓存是MySQL在5.0版本引入的一个特性,它允许服务器存储已执行过的SQL查询结果,以便后续相同的查询可以直接从缓存中获取结果,而无需再次执行SQL语句。这对于那些不经常改变但频繁查询的数据,可以显著提升系统...

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

    在MySQL数据库系统中,查询缓存是一个非常重要的性能优化机制,它允许服务器存储先前执行的SQL查询及其结果,以便在后续请求相同查询时快速返回结果,而无需再次解析和执行查询。然而,这也可能导致某些情况下优化...

    Mysql查询流程分析

    如果之后有相同的查询再次执行,MySQL可以直接从缓存中获取结果而无需重新执行查询,从而大大提高了查询速度。然而,需要注意的是,查询缓存的使用可能会受到某些因素的影响,例如缓存空间大小限制以及缓存失效策略...

    Mysql执行过程与BufferPool缓存机制.png

    Mysql执行过程与BufferPool缓存机制.png

    Mysql 执行计划解读

    MySQL执行计划是数据库查询优化中不可或缺的一部分,它能够详细展示SQL查询的执行方式,帮助数据库管理员和开发人员深入理解查询的内部细节,从而对查询进行优化。执行计划通过EXPLAIN关键字来获取,它会对SELECT...

    MYSQL查询缓存性能问题分析与优化案例(绝对精华)[参照].pdf

    2. **定期评估**:随着时间推移,应用程序或工作负载的变化可能会影响与查询缓存的交互。因此,应定期重新评估查询缓存的配置。 3. **监控和性能分析**:通过MySQL的性能分析工具,如Performance Schema,监控查询...

    mysql 设置查询缓存

    可将如下语句 query_cache_size = ... 如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。 注意:查询缓存绝不返回过期数据。当数据被修改后,在查询缓存中的任何相

    一条SQL在MySQL中是如何执行的.pdf

    当你执行一个查询语句时,MySQL 会首先检查查询缓存中是否已经存在该语句的结果,如果存在,就直接返回结果,否则,就会继续执行查询语句。 分析器是 MySQL 的语法分析器,负责将 SQL 语句解析成一个抽象语法树,...

    mysql高级优化查询

    当一个查询被执行时,MySQL 会检查查询缓存中是否已经有该查询的结果。如果存在,则直接返回缓存中的结果;否则执行查询并将结果放入缓存中。这种方式可以显著减少数据库的 I/O 操作,提高查询效率。 #### 1.2 查询...

    【表119,,促销计划执行表】 mysql 多表查询 执行计划.doc

    本篇将重点讨论如何利用MySQL进行多表查询以及执行计划的选择。 一、JOIN操作 在MySQL中,有多种JOIN类型用于连接两个或多个表: 1. **INNER JOIN**:返回两个表中匹配的记录。 2. **LEFT JOIN (或 LEFT OUTER ...

    redis做mysql缓存服务器(公司内部培训资料)

    ### Redis作为MySQL缓存服务器(公司内部培训资料) #### 一、Redis简介 Redis是一种开源的键值存储系统,主要用于高速缓存数据。与Memcached相比,虽然两者都基于内存进行数据存储以确保高效率,但Redis具备更...

    MysqlHelper.cs带注释带缓存带MySql.Data.dll

    在.NET开发环境中,`MysqlHelper.cs`是一个用于与MySQL数据库交互的类文件,它通常包含了一套数据库操作的封装,比如执行SQL语句、事务处理等。`MysqlHelper`类是C#中实现数据库访问的一个常见模式,它简化了数据库...

    MySQL优化之缓存优化(续)

    MySQL缓存优化是数据库性能提升的关键一环,尤其在高并发和大数据量的场景下,合理利用缓存能显著减少磁盘I/O操作,提高查询速度。本文将深入探讨MySQL中的各种缓存机制及其优化策略。 首先,我们关注的是查询缓存...

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

    MySQL查询缓存是一种提高数据库性能的技术,它存储先前执行过的SQL查询的结果,以便在后续请求相同查询时,可以直接从缓存中返回结果,而无需重新执行查询。这在处理大量重复查询并且数据变更不频繁的场景中尤其有用...

Global site tag (gtag.js) - Google Analytics