MySQL执行计划extra中的using index 和 using where using

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

MySQL执行计划extra中的using index 和 using where using

Using where Using index

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

MySQL执行计划extra中的using index 和 using where using

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

MySQL执行计划extra中的using index 和 using where using

   

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

  1,查询的列未被索引覆盖,并且where筛选条件是索引的前导列,
       意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引,Extra中为NULL(没有信息)

MySQL执行计划extra中的using index 和 using where using

Using where

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

MySQL执行计划extra中的using index 和 using where using

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

  

MySQL执行计划extra中的using index 和 using where using

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/47838e15d088f0fd4a15c56558c8bfdb.html