执行计划 分析一条sql语句的效率 mysql_mysql的SQL语句执行计划分析:EXPLAIN

数据库最常见的操作就是查询了,我们经常要用"SELECT"语法对已有的表进行某种检索,但是在实际应用中,查询前我们并不知道该查询会如何运行、会使用多少时间、会涉及多少字段和记录,每次输入了SQL语句,点击运行,然后慢慢等待结果的出现,好的查询语句效率很高,而有时候也会遇到查询缓慢,久久没有运行完成的情况。

由于我们并不知道实际查询的时候数据库里发生了什么,数据库软件是怎样扫描表、怎样使用索引,因此我们能感知的就只有查询运行的时间,而往往在数据规模不大时,查询是瞬间的,因此在写SQL语句时也就比较随意,也很少使用索引来加速查询的速度。不过一旦数据规模增大,比如百万、千万、几亿的时候,我们写同样的查询语句却发现窗口迟迟没有结果,这个时候才知道数据规模已经限制了我们自由查询的速度。查询优化和索引也就显得很重要了。

那么,能不能在查询前就能预先估计查询究竟要涉及多少行、使用哪些索引、运行多久呢?答案是可以的,MySQL和SQL Server都提供了相应的功能和语法来实现,下面用一个拥有两千多万条记录的表来说明如何进行查询分析。该表有一个访问时间字段。

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。比如我们要分析如下SQL语句,该语句获取特定时间段的访问记录总数。

EXPLAIN

SELECT COUNT(*) FROM ××××××

WHERE

TIME_INT>=UNIX_TIMESTAMP('2010-03-01 18:00:00') AND

TIME_INT

table | type | possible_keys | key | key_len | ref | rows | Extra

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

这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL

这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

------------------------------

弄明白了explain语法返回的每一项结果,我们就能知道查询大致的运行时间了,如果查询里没有用到索引、或者需要扫描的行过多(比如>=几十万行),那么可以感到明显的延迟。因此需要改变查询方式或者新建索引。

比如没有建索引,或者查询写得不好(没有用到索引列),会造成如下扫描所有两千多万条记录的查询方案(type为"ALL",rows有两千多万),这显然是不可取的,运行的话至少需要一分钟的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机和单片机概述,微机与单片机概述课件.ppt

《微机与单片机概述课件.ppt》由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关《微机与单片机概述课件.ppt》文档请在天天文库搜索。1、1.微机与单片机概述1.1 微型计算机的特点和发展1.2 微机的分类与单片机1.3 微处理器、…

mysql 5.6 command line client闪退_MySQL 5.6 Command Line Client 点开闪退解决方法

先看下连接mysql本地库的2种方式。第一种运行cmd,键入mysql -uroot -p,如果提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件。就将mysql的安装路径添加的系统的环境变量中。连接成功的界面如下第二种方式:安装程序中搜索mysql找…

虚拟服务器的好处与坏处,常见服务器虚拟化的弊端主要是什么问题?

常见服务器虚拟化的弊端问题主要有以下几点:1、虚拟机蔓延:避免虚拟机蔓延一个常用的策略是为虚拟机分配有效期。临近有效期的虚拟机将会被打上标记,而且会给相关人员发送消息,要求批准保留该虚拟机。2、资源争用。在虚拟环境中&a…

centos7安装mysql的rpm_Centos7 安装MySQL(rpm方式)

1 软件准备(我的网盘链接:https://pan.baidu.com/s/1c2AS6uG 密码:e1sj)mysql-5.6.29-1.el7.x86_64.rpm-bundle.zip Centos7 (我遇到的坑 :用cnetos6.5mini版的时候很难找到依赖,网上可靠的资料不多,结果安装了一大…

计算机重启很慢,电脑重启慢的原因

电脑重启慢的原因电脑开机速度慢是现在比较常见的一个问题,但是有时候重启也很慢,那么,电脑重启慢的原因是什么?下面跟小编一起来了解一下吧!电脑重启慢的原因1、遭到木马病毒入侵,系统遭到破坏和修改,导致程序运行缓…

ibm招mysql_IBM-ETP实训之MySql基本命令总结

MySql学习笔记SQL的三种表示DDL(create、drop、alter)--隐式提交、DQL(select)、DML(insert、delete、update)--自动提交、DCL(commit、rollback)MySql的一些常用语句:1、 show databases;显示所有存在的数据库2、 use 数据库名;选择数据库3、 show tables;显示所选…

两个图片叠加在一起css,css两张图片怎么叠加在一起?

css实现两张图片叠加在一起的方法:首先添加2个img标签;然后设置它们的css样式为position:absolute;最后设置其中一个img样式为left:120px即可看见效果。使用css把两个图片叠加,可以通过position定位属性设置两张图片的位置来实现叠…

mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】

3.1-数据库事务什么是事务一系列有序的数据库操作:要么全部成功要么全部回退到操作前的状态中间状态对其他连接不可见事务的基本操作:基本操作 说明start transaction 开始事务commit 提交(全部完成)rollback 回滚(回到初始状态)-- 开启一个事务start tr…

css背景从左到右颜色渐变,CSS:linear-gradient()背景颜色渐变

background: linear-gradient(direction,color-stop1,color-stop2,...);direction:用角度值指定渐变的方向(或角度);color-stop1,color-stop2,...:用于指定渐变的起止颜色ps:至少需要两种颜色1 background: -webkit-linear-gradie…

WordPress文章ajax,使用ajax在WordPress后台删除文章方法

今天wpmee小编分享使用ajax在WordPress后台删除文章方法,直接上代码,将下面的代码添加到当前启用的WordPress主题的functions.php里面。// 后台 文章列表 ajax删除文章add_action( admin_footer, dahuzi_custom_internal_javascript );function dahuzi_c…

mac os qt项目编译_【Qt开发】第一个Qt程序Hello World!

一:说在前头我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级,冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗位…

vbs读取服务器上的txt文件,VBS读写txt文件常用方法

1、打开文件使用opentextfile方法set fs createobject(“scripting.filesystemobject”)set tsfs.opentextfile(“c:\1.txt”,1,true)注意这里需要填入文件的完整路径,后面一个参数为访问模式1为forreading2为forwriting8为appending第三个参数指定如果指定文件不存…

mysql的四层架构_分布式数据库服务器的四层架构

分布式数据库服务器的四层架构:访问层:接收访问信息并按负荷智能的分配给中转服务器,接受数据结果并返回客户端。中转层:接收访问服务器发来的数据访问指令,从总储存服务器寻找数据分布所在的储存服务器,发…

centos mysql 5.5.57_Centos MySQL 5.7安装、升级教程

MySQL 5.7安装、升级笔记分享:卸载当前的 MySQL查看当前 MySQL 版本:停止 MySQL 服务备份数据【数据不重要可以忽略】备份数据库,升级MySQL通常不会丢失数据,但保险起见,我们需要做这一步。输入命令:[rootc…

ug许可服务器在那个文件里,ug许可证位置在哪_ug许可证文件在哪的图文步骤

最近有朋友问小编ug许可证位置在哪的问题,ug安装后许可证在哪里呢?我们应该如何找到ug许可证文件夹的位置呢?相信很多朋友还不太明白。别着急,今天小编就针对ug许可证位置在哪的问题,以ug nx8.5为例,为大家…

如何登陆网页的back office_如何使用iPhone面容ID快速登陆应用或网页

我们总是会在手机中下载很多App,但是不一定都能够记住这些App的密码,即使就算记住了,想要使用某些应用时,不断需要输入密码也让人觉得焦虑。好在苹果在iOS 12中改进了密码自动填充功能,搭配您设备上先进的面容 ID 功能…

mysql 复杂的sql_mysql 一个复杂的sql

查询 物资明细:SELECT r.material_id,r.material_category,r.material_name,r.material_quality,r.standard,r.product_factory,r.material_type,r.measure_unit,(r.numr.num_sub) as num,(r.numr.num_sub)-num_sd-num_yd as current_js_numFROM-- 单独计算各个数值…

接口可以继承抽象类吗_Python接口类的多继承以及抽象类的单继承

一、接口类(面向对象开发的思想和规范)的多继承需求:定义一个tiger类:会走,会游定义一个hawk类:会走,会飞定义一个swan类:会走,会游,会飞(a)如果像以下代码的方式,则不能…

mysql查询注意_mysql中sql查询使用注意

1.注意DESC关键字仅适用于在它前面的列名(birth);不影响species列的排序顺序。SELECT name, species, birth FROM petORDER BY species, birth DESC; ---desc只影响birth.先按照species升序列排序,species值相同的再按照birth降序排序2.日期计算MySQL提供了几个函数…

php查询MySQL结果转化为数组_PHP如何将SQL查询结果转为多维数组,并按查询行输出...

在php中,SQL查询数据库得到的是多行多列的数据,如何将查询结果转为二维数组,我的目的是把多行查询结果按行输出,有没有什么方法,求详细代码示例查询结果示例:reserv_idnametyper...在php中,SQL查…