MySQL查询语句过程和EXPLAIN语句基本概念及其优化

 更新时间:2019年05月21日 14:40:51   作者:陈小峰_iefreer  
在MySQL中我们经常会使用到一些查询语句,如果使用合适的索引会大大简化和加速查找,下面小编来和大家一起学习一下知识

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上就是本篇文章的全部内容了,希望对各位有所帮助。如果大家还有其他方面的问题,可以留言交流,请持续关注脚本之家!

相关文章

  • MyEclipse连接Mysql数据库的方法(一)

    MyEclipse连接Mysql数据库的方法(一)

    这篇文章主要介绍了MyEclipse连接Mysql数据库的方法(一)的相关资料,非常实用,具有参考价值,需要的朋友可以参考下
    2016-05-05
  • wampserver下mysql导入数据库的步骤

    wampserver下mysql导入数据库的步骤

    这篇文章主要介绍了wampserver下mysql导入数据库的步骤,需要的朋友可以参考下
    2016-08-08
  • windows环境下mysql数据库的主从同步备份步骤(单向同步)

    windows环境下mysql数据库的主从同步备份步骤(单向同步)

    本文主要是向大家描述的是在windows环境之下实现MySQL数据库的主从同步备份的正确操作方案,以下就是文章的详细内容描述
    2011-05-05
  • MySQL索引背后的之使用策略及优化(高性能索引策略)

    MySQL索引背后的之使用策略及优化(高性能索引策略)

    MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。本章讨论的高性能索引策略主要属于结构优化范畴
    2012-01-01
  • MySQL如何使用union all获得并集排序

    MySQL如何使用union all获得并集排序

    这篇文章主要介绍了MySQL如何使用union all获得并集排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • mysql滑动订单问题原理与解决方法实例分析

    mysql滑动订单问题原理与解决方法实例分析

    这篇文章主要介绍了mysql滑动订单问题原理与解决方法,结合实例形式分析了mysql滑动订单的问题的基本原理、解决方法与相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • 查看修改MySQL表结构命令

    查看修改MySQL表结构命令

    这篇文章主要介绍了查看修改MySQL表结构命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mysql中调试存储过程最简单的方法

    Mysql中调试存储过程最简单的方法

    以前同事告诉我用临时表插入变量数据来查看,但是这种方法过于麻烦,而且Mysql没有比较好的调试存储过程的工具。今天google了下发现可以用select + 变量名的方法来调试
    2021-06-06
  • Mysql树形递归查询的实现方法

    Mysql树形递归查询的实现方法

    这篇文章主要给大家介绍了关于Mysql树形递归查询的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • MySQL Router实现MySQL的读写分离的方法

    MySQL Router实现MySQL的读写分离的方法

    MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy。本文主要介绍了MySQL Router实现MySQL的读写分离的方法,感兴趣的可以了解一下
    2021-05-05

最新评论