今天就跟大家聊聊有关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 >
![]()
根据上图:类型:所有及额外:使用filesort可得,索引没有生效。
继续进行试验,对查询语句进一步改写,加上一个范围查找:
EXPLAIN 选择 ,性别 从 ,员工 WHERE first_name 祝辞,& # 39;利亚# 39; ORDER ,first_name、 以前,last_name >执行计划显示如下图:
EXPLAIN 选择 ,性别 从 ,员工 WHERE first_name 祝辞,& # 39;Tzvetan& # 39; ORDER ,first_name、 以前,last_name >
选择 ,COUNT (first_name) 从 ,员工 ORDER ,first_name、 以前,last_name >
![]()
第二次改写的sql根据复合索引得到的数据量为:<强> 159149 >强,为全表数据量的1/2。
选择 ,COUNT (first_name) 从 ,员工 WHERE first_name 祝辞,& # 39;利亚# 39; ORDER ,first_name、 以前,last_name >
选择 数(first_name)才能 从 ,员工 WHERE first_name 祝辞,& # 39;Tzvetan& # 39; ORDER first_name、才能 last_name才能
![]()
通过对比发现,第二次改写的sql根据复合索引得到的数据量是全表数据量的1/2。此时还没有达到MySql使用索引进行二次查找的量级。第三次改写的sql根据复合索引得到的数据量是全表数据量的1/10,达到了MySql使用索引进行二次查找的量级,于是从执行计划上可以看的到,第三次改写sql是走了索引的。
3总结
MySql是否根据首次索引条件查询出的主键进行二次查找,也是要看查询出来的数据量级,如果数据量接近全表数据量的话,就会进行全表扫描,否则根据第一次查询出来的主键进行二次查询。
MySql数据库中无法使用索引进行范围查找如何解决