首页 > 数据库 >详解MySQL中EXPLAIN解释

详解MySQL中EXPLAIN解释

时间:2023-11-08 16:01:49浏览次数:37  
标签:sell EXPLAIN MYSQL 查询 索引 详解 MySQL ticket order


explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

EXPLAIN列的解释:


table:显示这一行的数据是关于哪张表的



type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和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:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免




例如:


1、未使用索引


EXPLAIN   select sell_channel from `order` LEFT JOIN ticket_ex on(`order`.ticket_id=ticket_ex.ticket_id)


WHERE `order`.state  IN ('succeed','sell_succeeded','give_back_ticket')


and `order`.created_at>='2015-02-01'


and `order`.created_at<'2015-02-02' 


and `order`.sell_channel NOT IN ('station_window')


GROUP BY ticket_ex.passenger_id_no,`order`.sell_channel

详解MySQL中EXPLAIN解释_sql

查询时间使用3.567s


1、使用索引


EXPLAIN   select sell_channel from `order` LEFT JOIN ticket_ex on(`order`.ticket_id=ticket_ex.ticket_id)


WHERE `order`.state  IN ('succeed','sell_succeeded','give_back_ticket')


and `order`.sell_succeeded_at>='2015-02-01'


and `order`.sell_succeeded_at<'2015-02-02' 


and `order`.sell_channel NOT IN ('station_window')


GROUP BY ticket_ex.passenger_id_no,`order`.sell_channel



详解MySQL中EXPLAIN解释_字段_02



查询时间0.000s

结论:

1. 对需要查询和排序的字段要加索引。


2. 在一定环境下,left join还是比普通连接查询效率要高,但是要尽量少地连接表,并且在做连接查询时注意观察索引是否起了作用。


3. 排序尽量对第一个表的索引字段进行,可以避免mysql创建临时表,这是非常耗资源的。


4. 对where条件里涉及到的字段,应适当地添加索引,这样会对排序操作有优化的作用。


5. 在做随机抽取数据的需求时,避免使用order by rand(),从上面的例子可以看出,这种是很浪费数据库资源的,在执行过程中用show processlist查看,会发现第(3)条有Copying to tmp table on disk。而对(3)和(4)的对比得知,如果要实现这个功能,最好另辟奚径,来减轻Mysql的压力。


6. 从第4点可以看出,如果说在分页时我们能先得到主键,再根据主键查询相关内容,也能得到查询的优化效果。通过国外《High Performance MySQL》专家组的测试可以看出,根据主键进行查询的类似“SELECT ... FROM... WHERE id = ...”的SQL语句(其中id为PRIMARYKEY),每秒钟能够处理10000次 以上的查询,而普通的SELECT查询每秒只能处理几十次到几百次 。涉及到分页的查询效率问题,网上的可用资源越来越多,查询功能也体现出了它的重要性。也便是sphinx、lucene这些第三方搜索引擎的用武之地了。


7. 在平时的作业中,可以打开Mysql的Slow queries功能,经常检查一下是哪些语句降低的Mysql的执行效率,并进行定期优化。


标签:sell,EXPLAIN,MYSQL,查询,索引,详解,MySQL,ticket,order
From: https://blog.51cto.com/u_809530/8255991

相关文章

  • 实例详解构建数仓中的行列转换
    本文分享自华为云社区《GaussDB数据库SQL系列-行列转换》,作者:Gauss松鼠会小助手2。一、前言在构建数据仓库或做数据分析时,需要对原始数据的结构进行一定的处理,有时涉及到“行转列”,有时涉及到“列转行”,那么这两个转换的方式具体是什么,有什么差异,怎么实现,今天我们将以GaussDB数......
  • 最全面的移动端UI组件设计详解:下篇
    上一期给大家讲解了《最全面的移动端UI组件设计详解:中篇》,主要分享了:基础组件、表单组件和反馈组件3个部分;这次给大家带来:数据展示组件和其他组件详解,希望你在设计APP、小程序、H5页面中,能熟练使用和理解各种的UI组件,今天给大家总结了关于移动端UI组件,希望可以在工作中帮到你。......
  • Spring 3.0 注解注入详解
    一、各种注解方式 1.@Autowired注解(不推荐使用,建议使用@Resource)     @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。要使@Autowired能够工作,还需要在配置文件中......
  • 最全面的移动端 UI组件设计详解:上篇
    作为一名UI设计师,我们经常要进行PC端和移动端的设计任务,上一次给大家分享了:《最全Web端UI组件设计详解》,这次给大家带来移动端UI组件设计详情,尤其在我们APP、小程序、H5页面设计中,我们要使用和熟知各种的UI组件,今天给大家总结了关于移动端UI组件,希望可以在工作中帮到你。什么......
  • OpenGL 摄像机视角详解
    1.摄像机摄像机就好像是我们的眼睛,我们从摄像机的方向观察世界空间中的模型。摄像机远离模型,模型自然就变小了(透视投影下),然而,在GL中事实上并没有摄像机的概念。但是我们可以通过移动世界空间远离我们的摄像机来模拟摄像机远离世界的感觉。这也正是在上一章中,我们的观察矩阵是(0,......
  • 数据类型详解
     注意:前边定义了后边输出就不用加引号,如果前边没有定义就后边加引号,如果加的是单引号就只能输入一个字符,如果是双引号就可以输入好多 ......
  • mysql 远端数据库的数据备份与恢复
    备份基本语法mysqldump-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名称]>/home/username/备份文件.sql例如mysqldump-uroot-p123456-h192.168.1.100-P3306mydb>mydb_backup.sql恢复基本语法mysql-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名......
  • MySQL学习(13)内存中的数据——Buffer Pool
    BufferPool是什么BufferPool就是MySQL服务器启动时向操作系统申请的一片连续的内存。默认情况下,BufferPool的容量为128MB。SHOWVARIABLESLIKE'innodb_buffer_pool_%'; 可以通过启动项innodb_buffer_pool_size设置(单位为字节),不能设置小于5MB。[server]innodb_buf......
  • MySQL的存储引擎、事务补充、MySQL的锁机制、MySQL的日志
    MySQL的存储引擎概述数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。用户可......
  • 30张图详解IP地址网络知识
    你们好,我的网工朋友。IP地址是所有网络初级课程里最先涉及到的技术点,对于IP地址的合理规划是网络设计的重要环节,必须拿捏。IP地址规划的好坏,影响到网络路由协议算法的效率,影响到网络的性能,影响到网络的扩展,影响到网络的管理,也必将直接影响到网络应用的进一步发展。今天和你分享一篇......