Mysql中between...and引起的索引失效问题及解决

 更新时间:2023年07月28日 10:27:35   作者:等待中的小码农  
这篇文章主要介绍了Mysql中between...and引起的索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

发生场景

在查询学生表的时候,需要支持根据创建时间来筛选出某段时间内入学的学生总数,因此在创建时间上加了索引,但是最终发现还是会走全量查询。

实验过程

CREATE TABLE `t_user` (
  `id` bigint(11) unsigned NOT NULL COMMENT '学生id',
  `name` varchar(24) NOT NULL COMMENT '学生名称',
  `createTime` dat NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `index_updateTime` (`createTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
select count(1) from t_user where createTime between '2022-08-30' and '2022-08-31';

使用insert语句插入3万多条数据后,其中30号至31号之前有9千多条数据,发现查询的时候并没有走到索引。

结果如下:

在这里插入图片描述

缩小查询区间,只查31号的(4千多条数据),却发现可以走到索引了,

结果如下:

select count(1) from t_user where createTime between '2022-08-31' and '2022-08-31';

在这里插入图片描述

再找一个数据量为5千的区间来试一下,也是会走到索引的,

结果如下:

select count(1) from t_user where createTime between '2022-08-23' and '2022-08-25';

在这里插入图片描述

没走到索引是因为between…and引起的吗?如果改为>=和<=呢。

结果如下:

select count(1) from t_user where createTime >= '2022-08-30' and createTime  <= '2022-08-31';

在这里插入图片描述

结论

经过实验发现,当查询的数据量达到6千(占比20%左右),就不走索引了。

引起原因:

表的数据量太大,会让数据库中的优化器进行处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引,查询的量太大,导致优化器认为走全表查询时间效率更佳。

但是如果一定要用到区间查询,这个问题该如何解决呢?

方案一

select count(1) from t_user where createTime between '2022-08-30' and '2022-08-31' limit 1;

在这里插入图片描述

方案二

select count(1) from t_user FORCE INDEX(index_updateTime) where createTime between '2022-08-30' and '2022-08-31';

在这里插入图片描述

思考:

当查询数据量达到一定量的时候会导致between…and索引失效,那分页查询的时候呢?

select id,name, createTime from t_user where createTime between '2022-08-30' and '2022-08-31' limit 1,500;

在这里插入图片描述

可见,查询第一页的时候索引有效,但是随着页码越来越大的时候,索引却失效了,

select id,name, createTime from t_user where createTime between '2022-08-30' and '2022-08-31' limit 100000,500;

在这里插入图片描述

因此,遇到这种因查询数据量过大而导致的索引失效的问题,需要对其功能做相应限制处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 利用Shell脚本实现远程MySQL自动查询

    利用Shell脚本实现远程MySQL自动查询

    本篇文章是对利用Shell脚本实现远程MySQL自动查询的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL表字段设置默认值(图文教程及注意细节)

    MySQL表字段设置默认值(图文教程及注意细节)

    默认值的设置很重要,比如在插入的时候一些字段是可以省略的,这会带来很多的方便,接下来将要介绍MySQL表字段设置默认值感兴趣的你可以千万不要走开啊,希望本文对你有所帮助
    2013-01-01
  • MySQL中的max()函数使用教程

    MySQL中的max()函数使用教程

    这篇文章主要介绍了MySQL中的max()函数使用教程,是学习MySQL入门的基础知识,需要的朋友可以参考下
    2015-05-05
  • MySQL中一些鲜为人知的排序方式

    MySQL中一些鲜为人知的排序方式

    这篇文章主要给大家介绍了关于MySQL中一些鲜为人知的排序方式,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • navicat连接mysql报错1251的解决方法

    navicat连接mysql报错1251的解决方法

    这篇文章主要为大家详细介绍了navicat连接mysql报错1251的解决方法,文中解决方法介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • MySQL中Binlog文件占用空间比较大该如何清理

    MySQL中Binlog文件占用空间比较大该如何清理

    在MySQL中binlog(二进制日志)是一种记录数据库操作的日志文件,它记录了数据库更改的所有操作,这篇文章主要介绍了MySQL中Binlog文件占用空间比较大该如何清理的相关资料,需要的朋友可以参考下
    2025-09-09
  • Mac 安装和卸载 Mysql5.7.11 的方法

    Mac 安装和卸载 Mysql5.7.11 的方法

    本文给大家介绍Mac 安装和卸载 Mysql5.7.11 的方法,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-03-03
  • MySQL处理和消除重复数据的多种方法

    MySQL处理和消除重复数据的多种方法

    在数据库管理中,数据重复是一个常见的问题,重复数据不仅浪费存储空间,还可能导致数据分析的偏差和错误,ySQL作为一种流行的关系型数据库管理系统,提供了多种方法来处理和消除重复数据,本文将详细介绍MySQL处理重复数据的方法,需要的朋友可以参考下
    2025-12-12
  • MySQL数据库之联合查询 union

    MySQL数据库之联合查询 union

    这篇文章主要介绍了MySQL数据库之联合查询 union,联合查询就是将多个查询结果的结果集合并到一起,字段数不变,多个查询结果的记录数合并,下文详细介绍需要的小伙伴可以参考一下
    2022-06-06
  • MySQL explain获取查询指令信息原理及实例

    MySQL explain获取查询指令信息原理及实例

    这篇文章主要介绍了MySQL explain获取查询指令信息原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论