失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介【MySQL】

MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介【MySQL】

时间:2020-08-19 05:41:54

相关推荐

MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介【MySQL】

数据库|mysql教程

数据库,关键点,开发,如何,网站

数据库-mysql教程

MySQLexplain

基于php的下载网站源码,怎么进去ubuntu界面,草鞋爬虫怎么消灭,sockjs php,海网站seolzw

ios网页安装源码,vscode光标实用技巧,ubuntu 词典推荐,外部tomcat怎么调试,爬虫加热定时,php 二维数组 交集,vuw开发怎么做seo,wordpress网站安全,精美淘宝模板lzw

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

易语言远程源码,vscode报错窗口,ubuntu bt,tomcat是干什么的,sqlite 时间类型,品牌网电脑版网页设计,一个网站两个数据库,苏州做服务器公司,我要报名网 插件,ace前端框架文档,苏州爬虫,php 数组 合并,株洲seo,面试springboot类加载,dede标签大全,网站一键分享 代码,flash网页源码,科技类网站模板,网站后台密码,滚动条加载页面,java学籍管理系统设计,积分卡程序lzw

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

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

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

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

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

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

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

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

[plain]

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表示附加信息,常见的有如下几种(也按查询效率从高到低排列):

[plain]

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

[plain] mysql> explain select user.Username, user_profile.nickname, user_profile.gender, user_profile.meet_receive from user_profile join users on users.Id = user_profile.user_id where user_profile.`display` = 1 order by user_profile.fl_no limit 50;

+—-+————-+———————+——–+—————+———+———+—————————————-+——-+———————————————-+| id | select_type | table| type | possible_keys | key| key_len | ref | rows | Extra |+—-+————-+———————+——–+—————+———+———+—————————————-+——-+———————————————-+| 1 | SIMPLE| user_profile | ALL | NULL| NULL | NULL | NULL | 14399 | Using where; Using temporary; Using filesort || 1 | SIMPLE| users| eq_ref | PRIMARY | PRIMARY | 8 | cms.user_profile.user_id |1 | Using where |+—-+————-+———————+——–+—————+———+———+—————————————-+——-+———————————————-+2 rows in set (0.00 sec)

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

如果觉得《MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介【MySQL】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。