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

作者:陈小峰_iefreer 时间:2024-01-18 07:44:36 

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

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

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

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

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

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

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

MySQL查询语句过程和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结果实例(从用户档案表中找出昵称和性别,按用户表中的用户关注者数量排序):

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

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

来源:https://blog.csdn.net/iefreer/article/details/12621415

标签:EXPLAIN语句,MyQSL,查询
0
投稿

猜你喜欢

  • PyTorch中Tensor的数据类型和运算的使用

    2023-01-04 14:53:21
  • 原型方法的不同写法居然会影响调试的解决方法

    2024-04-17 10:02:32
  • Python爬虫自动化爬取b站实时弹幕实例方法

    2023-03-21 04:45:42
  • Python实现PS滤镜碎片特效功能示例

    2021-04-25 01:35:31
  • MySQL数据库执行Update卡死问题的解决方法

    2024-01-15 16:06:50
  • apache+php+mysql安装配置方法小结

    2023-11-11 23:29:31
  • MySQL详解如何优化查询条件

    2024-01-26 06:52:05
  • python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序

    2022-04-23 02:28:25
  • 在python中实现将一张图片剪切成四份的方法

    2023-10-04 02:20:04
  • 如何基于python把文字图片写入word文档

    2021-04-20 06:48:49
  • 如何使用SQL Server中的客户端配置工具

    2009-01-13 14:05:00
  • [项目布局配置]Nosql与PythonWeb-Flask框架组合

    2022-07-08 19:55:40
  • perl 删除数组元素的几种方法小结

    2023-07-14 18:31:11
  • Python与CNN的碰撞详解

    2023-01-09 13:21:12
  • pycharm部署django项目到云服务器的详细流程

    2021-05-27 23:32:19
  • Python readline()和readlines()函数实现按行读取文件

    2022-02-21 13:19:36
  • Vue为何弃用Ajax,选择Axios?ajax与axios的区别?

    2024-04-30 10:38:52
  • 数据库备份过程中经常遇到的九种情况

    2008-12-26 16:38:00
  • Python实现将Excel内容插入到Word模版中

    2022-05-04 23:21:03
  • 如何使用Git优雅的回滚实现

    2022-03-17 15:49:15
  • asp之家 网络编程 m.aspxhome.com