MySql数据库中无法使用索引进行范围查找如何解决

  介绍

今天就跟大家聊聊有关MySql数据库中无法使用索引进行范围查找如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1问题描述

对建立好的复合索引进行排序,并取记录中非索引字段,发现索引不生效,例如,有如下表,DDL语句为:

CREATE  TABLE ”员工,(   ,列出的int (11), NOT 空,   ,‘birth_date date  NOT 空,   ,‘first_name varchar (14), NOT 空,   ,‘last_name varchar (16), NOT 空,   ,“性别”enum(& # 39;猴# 39;,& # 39;f # 39;), NOT 空,   ,‘hire_date date  NOT 空,   ,“年龄”int (11), NOT 空,   ,PRIMARY  KEY (列出),   ,KEY “unique_birth_name”, (“first_name”、“last_name”), USING  BTREE   ,)引擎=InnoDB  DEFAULT  CHARSET=use utf8;

复合索引为<代码> unique_birth_name (first_name、last_name)> EXPLAIN 选择   ,性别   从   ,员工   ORDER    ,first_name、   以前,last_name

 MySql数据库中无法使用索引进行范围查找如何解决

根据上图:类型:所有及额外:使用filesort可得,索引没有生效。

继续进行试验,对查询语句进一步改写,加上一个范围查找:

EXPLAIN 选择   ,性别   从   ,员工   WHERE  first_name 祝辞,& # 39;利亚# 39;   ORDER    ,first_name、   以前,last_name

执行计划显示如下图:

 MySql数据库中无法使用索引进行范围查找如何解决”>,</p> <p>这里发现结果和第一次sql分析无异。继续试验。</p> <p>改写sql语句:</p> <pre类= EXPLAIN 选择   ,性别   从   ,员工   WHERE  first_name 祝辞,& # 39;Tzvetan& # 39;   ORDER    ,first_name、   以前,last_name

 MySql数据库中无法使用索引进行范围查找如何解决”>,</p> <p>此时,令人惊讶的是,索引生效了。</p> <h4> 2问题分析</h4> <p>此时,我们做一个大胆的猜测:</p> <p>第一次进行sql分析时,因为第一次订单后,得到的还是全表数据,如果根据复合索引中携带的主键查找每一个性别进行拼接,自然很费资源和时间,MySql不会做如此蠢的事。不如直接进行全表扫描,把扫描到的每条数据和order by得到的临时数据进行拼接,从而得到需要的数据。</p> <p>为了验证上述想法的正确性,我们对三次sql进行分析。</p> <p>第一次sql根据复合索引得到的数据量为:<强> 300024 </>强,为全表数据</p> <pre类=选择   ,COUNT (first_name)   从   ,员工   ORDER    ,first_name、   以前,last_name

 MySql数据库中无法使用索引进行范围查找如何解决

第二次改写的sql根据复合索引得到的数据量为:<强> 159149 强,为全表数据量的1/2。

选择   ,COUNT (first_name)   从   ,员工   WHERE  first_name 祝辞,& # 39;利亚# 39;   ORDER    ,first_name、   以前,last_name

 MySql数据库中无法使用索引进行范围查找如何解决”>,</p> <p>第三次改写的sql根据复合索引得到的数据量为:<强> 36731 </>强,为全表数据量的1/10。</p> <pre类=选择   数(first_name)才能   从   ,员工   WHERE  first_name 祝辞,& # 39;Tzvetan& # 39;   ORDER    first_name、才能   last_name才能

 MySql数据库中无法使用索引进行范围查找如何解决

通过对比发现,第二次改写的sql根据复合索引得到的数据量是全表数据量的1/2。此时还没有达到MySql使用索引进行二次查找的量级。第三次改写的sql根据复合索引得到的数据量是全表数据量的1/10,达到了MySql使用索引进行二次查找的量级,于是从执行计划上可以看的到,第三次改写sql是走了索引的。

3总结

MySql是否根据首次索引条件查询出的主键进行二次查找,也是要看查询出来的数据量级,如果数据量接近全表数据量的话,就会进行全表扫描,否则根据第一次查询出来的主键进行二次查询。

MySql数据库中无法使用索引进行范围查找如何解决