网站或服务的性能关键点很大程度在于数据库的设计(假设你选择了合适的语言开发框架)以及如何查询数据上。

我们知道MySQL的性能优化方法,一般有建立索引、规避复杂联合查询、设置冗余字段、建立中间表、查询缓存等,也知道用EXPLAIN来查看执行计划。

但对MySQL复杂查询语句执行过程和内部机制,MySQL Optimizer本身所做优化以及查询语句调整对性能所产生的影响及其原因知之甚少。

本文试图对其中的一些关键概念如执行过程、索引使用等做比较深入的探讨,知其然,知其所以然,

这样可以避免在原本通过MySQL简单优化就能获得很好效果的情况下,盲目跟风转向NoSQL存储或者投入资金升级基础设施。

工欲善其事,必先利其器,这里首先介绍MySQL查询语句性能分析工具。

MySQL的EXPLAIN命令是用来分析查询性能的工具,EXPLAIN的输出每一行对应于查询语句中的一张表的执行计划说明,其输出列含义如下表:

上表中type列是表关联类型,常见的有如下类型(按关联查询效率从高到低排列):

[plain] view plaincopy
  1. const(常量连接),比如SELECT * FROM user WHERE id=1;
  2. eq_ref(等值引用),比如SELECT * FROM user,card WHERE user.id=card.userid;
  3. ref(引用),用于非唯一索引,比如SELECT * FROM user,card WHERE user.last_name='test';
  4. range(范围),比如SELECT * FROM tbl_name WHERE key_column > 10;
  5. index(索引),根据索引来读取数据,如果索引已包含了查询数据,只需扫描索引树,否则执行全表扫描和All类似;
  6. ALL(所有),全表扫描

key列代表索引(index),rows表示估计会扫描多少行记录,

Extra表示附加信息,常见的有如下几种(也按查询效率从高到低排列):

[plain] view plaincopy
  1. Using index:表示使用索引,如果同时出现Using where,代表使用索引来查找读取记录,如果没有Using where,表示索引包含查询数据,无需额外的查找;
  2. Using where:表示条件查询,如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据;
  3. Using filesort:不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息;
  4. Using temporary:表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序的场合;

如果EXPLAIN出现后面两个信息(Using filesort,Using temporary),而rows又比较大,通常意味着你需要调整查询语句,或者需要添加索引,总之需要尽量消除这两个信息。

下面给出EXPLAIN结果实例(从用户档案表中找出昵称和性别,按用户表中的用户关注者数量排序):

上面的查询语句就是典型的问题案例,Using filesort和Using temporary的具体含义以及如何优化上述语句放在下一篇文章中结合查询过程和原理来专门讨论。

转载于:https://www.cnblogs.com/donizzh/p/4610478.html

MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介相关推荐

  1. mysql查询每次才返回1000_MySQL性能优化的最佳20+条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  2. mysql 查询正在执行的事务以及等待锁 常用的sql语句

    使用navicat测试学习: 首先使用set autocommit = 0;(取消自动提交,则当执行语句commit或者rollback执行提交事务或者回滚) 在打开一个执行update 查询 正在执 ...

  3. MySQL数据库基础知识7,查询的执行过程

    目录 一.拆分查询 二.分解关联查询 三.查询的执行过程 四.优化器的一些优化手段 1.重新定义关联表的顺序 2.将外连接转化为内连接 3.使用增加变换规则 4.优化count().max().min ...

  4. mysql 查询语句执行顺序_MySQL 查询语句执行过程

    MySQL 查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注的是, ...

  5. mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程

    mysql基础架构 示意图 首先 mysql  大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...

  6. java mysql查询语句_Mysql查询语句执行过程

    Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注的是, ...

  7. 【MySQL】一条查询语句在MySQL内部的执行过程

    我们几乎每天都在写SQL语句,当我们写了一条查询语句,会得到一个查询结果,但是它在MySQL内部是怎样的一个执行过程呢? mysql> select * from T where Id = 10 ...

  8. Mysql查询语句执行过程及运行原理

    Mysql查询语句执行原理 数据库查询语句如何执行? DML语句首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树. 语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用 ...

  9. MySQL语句执行过程

    目录 前言 MySQL语句执行过程 一.连接器 二.查询缓存 三.分析器 四.优化器 1.逻辑查询优化 1.1 逻辑查询优化思路. 2.2 查询重写规则 2.3 启发式规则再逻辑优化阶段的应用 2.3 ...

最新文章

  1. NGS数据的Error correction方法
  2. dfmea文件_PFMEA执行之步骤七:结果文件化 vs 高层管理者的承诺
  3. vue中展示列表,类似formatter方法及在vue中点击页面信息事件
  4. 20180705 考试记录
  5. LeetCode 717. 1-bit and 2-bit Characters
  6. 【http】记一次http无法连通总是超时的问题
  7. JAVA控制台扑克牌游戏,洗牌,发牌,比较大小
  8. python中@staticmethod_Python中的 @staticmethod@classmethod方法
  9. VS 2005 下载地址
  10. 深度学习入门之猫vs狗(超简单)
  11. teamview+ccproxy实现远程局域网本地访问
  12. switch按钮的显示隐藏
  13. numpy学习笔记:np.zeros应用——生成三通道全黑Mask(蒙版)
  14. AIX小型机安装JAVA JDK的方法
  15. echo 3 drop_如何通过Drop In将Amazon Echo用作对讲机
  16. 基于机器学习的UEBA在账号异常检测中的应用
  17. 【ftp】725本电子书下载
  18. 渐行渐远的老朋友们,谢谢你们曾经陪我走过
  19. 【无标题】使用Ping命令制作的批量Ping工具,可对指定Ip进行ping测试,并将结果记录到txt文件
  20. Ubuntu20.04安装搜狗拼音(详细操作 有图)

热门文章

  1. 3D数学之矩阵的各种求逆
  2. 用Java实现古典问题兔子的计算
  3. mysql存储过程返回hello world_Mysql存储过程 之 “Hello,World”
  4. 图片生成html_markdown 生成头条文章的一个实现
  5. 推荐系统组队学习——协同过滤
  6. Leetcode组队学习——分治
  7. keras版Mask-RCNN来训练自己的目标检测数据集
  8. 抽取CNN网络任意层的特征,VGG模型fine-tuning实践
  9. 泵车砼活塞故障预警-冠军方案
  10. 获取手机idfa_东风无力百花残 | IDFA留给开发者的时间不多了