www.linuxidc.com/Linux/2017-…

mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息

其中跟索引有关的using index 在不同的情况下会出现Using index, Using where Using index ,Using index condition等

那么Using index 和 Using where;Using index 有什么区别?网上搜了一大把文章,说实在话也没怎么弄懂,于是就自己动手试试。

本文仅从最简单的单表去测试using index 和 using where using index以及简单测试using index condition的情况的出现时机 。

执行计划的生成与表结构,表数据量,索引结构,统计信息等等上下文等多种环境有关,无法一概而论,复杂情况另论。

测试环境搭建

测试表以及测试数据搭建,类似于订单表和订单明细表,暂时先用订单表做测试

测试表结构

create table test_order

(

id int auto_increment primary key,

user_id int,

order_id int,

order_status tinyint,

create_date datetime

);create table test_orderdetail

(

id int auto_increment primary key,

order_id int,

product_name varchar(100),

cnt int,

create_date datetime

);

create index idx_userid_order_id_createdate on test_order(user_id,order_id,create_date);

create index idx_orderid_productname on test_orderdetail(order_id,product_name);复制代码

测试数据(50W)

CREATE DEFINER=`root`@`%` PROCEDURE `test_insertdata`(IN `loopcount` INT)

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT ''

BEGIN

declare v_uuid varchar(50);

while loopcount>0 do

set v_uuid = uuid();

insert into test_order (user_id,order_id,order_status,create_date) values (rand()*1000,id,rand()*10,DATE_ADD(NOW(), INTERVAL - RAND()*20000 HOUR));

insert into test_orderdetail(order_id,product_name,cnt,create_date) values (rand()*100000,v_uuid,rand()*10,DATE_ADD(NOW(), INTERVAL - RAND()*20000 HOUR));

set loopcount = loopcount -1;

end while;

END 复制代码

Using index VS Using where Using index

首先,在"订单表"上,这里是一个多列复合索引

create index idx_userid_order_id_createdate on test_order(user_id,order_id,create_date);

Using index

1,查询的列被索引覆盖,并且where筛选条件是索引的是前导列,Extra中为Using index

Using where Using index

1,查询的列被索引覆盖,并且where筛选条件是索引列之一但是不是索引的不是前导列,Extra中为Using where; Using index,意味着无法直接通过索引查找来查询到符合条件的数据

2,查询的列被索引覆盖,并且where筛选条件是索引列前导列的一个范围,同样意味着无法直接通过索引查找查询到符合条件的数据

NULL(既没有Using index,也没有Using where Using index,也没有using where)

1,查询的列未被索引覆盖,并且where筛选条件是索引的前导列,

意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引,Extra中为NULL(没有信息)

Using where

1,查询的列未被索引覆盖,where筛选条件非索引的前导列,Extra中为Using where

2,查询的列未被索引覆盖,where筛选条件非索引列,Extra中为Using where

using where 意味着通过索引或者表扫描的方式进程where条件的过滤,

反过来说,也就是没有可用的索引查找,当然这里也要考虑索引扫描+回表与表扫描的代价。

这里的type都是all,说明MySQL认为全表扫描是一种比较低的代价。

Using index condition

1,-- 查询的列不全在索引中,where条件中是一个前导列的范围

2,查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)

多表关联的时候Using index condition出现的情况更多,目前还不怎么理解Using index condition的内部实现模式。

结论:

1,Extra中的为Using index的情况

where筛选列是索引的前导列 &&查询列被索引覆盖 && where筛选条件是一个基于索引前导列的查询,意味着通过索引超找就能直接找到符合条件的数据,并且无须回表

2,Extra中的为空的情况

查询列存在未被索引覆盖&&where筛选列是索引的前导列,意味着通过索引超找并且通过“回表”来找到未被索引覆盖的字段,

3,Extra中的为Using where Using index:

出现Using where Using index意味着是通过索引扫描(或者表扫描)来实现sql语句执行的,即便是索引前导列的索引范围查找也有一点范围扫描的动作,不管是前非索引前导列引起的,还是非索引列查询引起的。

尚未解决的问题:

查询1

查询2

查询3(逻辑上等价于查询1+查询2),执行计划发生了很大的变化。

总结:

MySQL执行计划中的Extra中信息非常多,不仅仅包括Using index,Using where Using index,Using index condition,Using where,尤其是在多表连接的时候,这一点在相对MSSQL来说,不够直观或者结构化。

MSSQL中是��过区分索引查找(index seek),索引扫描(index scan),表扫描(table scan)来实现具体的查询的,这图形化的执行计划在不同的场景下是非常直观的,要想完全弄懂MySQL的这个执行计划,可能要更多地在实践中摸索

mysql 执行计划extra_MySQL执行计划extra中的using index 和 using where using index 的区别...相关推荐

  1. mysql 执行计划extra_mysql执行计划explain type和extra

    mysql执行计划,搞定type和extra就能优化大部分sql了.type为主,extra为辅. type: system表只有一行,MyISAM引擎. const常量连接,表最多只有一行匹配,通用 ...

  2. MySQL执行计划extra中的using index 和 using where using index 的区别

    本文出处:http://www.cnblogs.com/wy123/p/7366486.html  (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些 ...

  3. 四、MySQL优化之explain执行计划的extra属性

    explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...

  4. MySQL索引管理及执行计划

    MySQL索引管理及执行计划 第1章 索引介绍: 索引是对数据库表中一列或者多列 的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的 ...

  5. Mysql 层级、执行顺序、执行计划分析

    逻辑分层 下面是MySQL的逻辑分层图: 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理.授权认证.安全等. 服务层:包括缓存查询.解析器.优化器 ...

  6. MySQL数据库:explain执行计划详解

    一.执行计划: 执行计划是SQL语句经过查询分析器后得到的 抽象语法树 和 相关表的统计信息 作出的一个查询方案,这个方案是由查询优化器自动分析产生的.由于是动态数据采样统计分析出来的结果,所以可能会 ...

  7. 执行计划级别mysql 2ef,Mysql 层级、执行顺序、执行计划分析

    逻辑分层 下面是MySQL的逻辑分层图: 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理.授权认证.安全等. 服务层:包括缓存查询.解析器.优化器 ...

  8. mysql的索引和执行计划

    一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许 ...

  9. 高性能mysql 附录D explain执行计划详解

    EXPLAIN: extended关键字:在explain后使用extended关键字,可以显示filtered列和warning信息.在较旧的MySQL版本中,扩展信息是使用EXPLAIN EXTE ...

最新文章

  1. 教你如何追缴中国移动恶意扣费:lol :lol
  2. 微信小程序--页面传参
  3. 远程桌面连计算机名称变ipv6,利用ipv6,从家里远程连接到学校的电脑上
  4. Re-attention机制Transformer,实现强大性能
  5. uni 修改数据页面不重新渲染
  6. 易语言对接验证码短信接口DEMO示例
  7. JS (GMT)与普通时间格式的互相转换,JS转GMT格式时间
  8. 微信小程序怎么做店铺_微信小程序如何开通店铺
  9. 肯德尔系数怎么分析_如何通过修改数据提高肯德尔系数?
  10. 计算机英语单词练习一
  11. 生病吃什么水果你知道吗?
  12. postgresql垃圾清理插件pg_repack
  13. 【Spring Boot】关于上传文件例子的剖析
  14. 在INTEL KABYALAKE平台上运行COREBOOT 记录
  15. pythonselenium浏览器_python3的爬虫笔记11——Selenium和浏览器的一些设置
  16. 利用百度地图sdk实现定位
  17. 何有效提高香港主机的访问速度?
  18. expect command
  19. python plt legend并排_matplotlib如何控制legend的位置之二
  20. BlockVC入选首批36氪中国区块链投资机构风云榜

热门文章

  1. java8u211_jre864位u211
  2. requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('',))
  3. ATS无法缓存QQ音乐的音频文件问题
  4. ubuntu常用翻译工具stardict
  5. Rocksdb 获取当前db内部的有效key个数 (估值)
  6. Cachegrind--缓存命中检查工具及其可视化
  7. linux ngxtop安装安装及使用
  8. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
  9. MySQL更新命令_UPDATE
  10. BZOJ 2957楼房重建