MySQL中between...and的使用对索引的影响说明

 更新时间:2023年07月28日 10:17:06   作者:米饭呀!大米饭  
这篇文章主要介绍了MySQL中between...and的使用对索引的影响说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1. 问题场景

一开始在某个字段加了普通索引,SQL语句查找该字段范围内的数据。

开始加索引的时候是能使用上索引的,但是过了几天,数据量增大,发现检索语句没有走索引了。

2. 准备测试

2.1 创建测试表

CREATE TABLE `test_index` (
`id`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
`age`  tinyint(5) UNSIGNED NOT NULL DEFAULT 0 ,
`status`  tinyint(1) UNSIGNED NOT NULL DEFAULT 1 ,
`create_time`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)

2.2 在age字段上加普通索引

ALTER TABLE `test_index`
ADD INDEX `age` (`age`) USING BTREE

2.3 插入3条测试数据

insert into test_index(name,age,create_time) values('Tom',12,time()),('Tobie',20,time()),('Jack',15,time())

3. 测试是否走索引(总记录数total-t,结果数result-r)

3.1 total = 3

测试一(t=3,r=0,走索引):

在这里插入图片描述

测试二(t=3,r=1,走索引):

在这里插入图片描述

测试三(t=3,r=2,走索引):

在这里插入图片描述

测试四(t=3,r=3,不走索引):

在这里插入图片描述

3.2 total = 10

  • t=10,r=0,走索引
  • t=10,r=4,走索引
  • t=10,r=5,不走索引

3.3 total=100

  • t=100,r=15,走索引
  • t=100,r=18,走索引
  • t=100,r=19,不走索引

3.4 total = 1000

  • t=1000,r=100,走索引
  • t=1000,r=150,走索引
  • t=1000,r=170,走索引
  • t=1000,r=171,不走索引

3.5 total = 10000

  • t=10000,r=900,走索引
  • t=10000,r=940,走索引
  • t=10000,r=941,不走索引
  • t=10000,r=1000,不走索引

3.6 total = 100000

  • t=100000,r=3948,走索引
  • t=10000,r=3949,不走索引

4. 结论

不严谨总结

自己还测了更大的数据,发现betweet…and的使用与单纯的数据量无关,而与查找到的数据与总数据的比有关

当总数据量较小时,有很大概率会走索引,此时查到的结果数可以允许比较大

但总数据量比较大之后,查找到的结果数据越小时,越大概率使用上索引

也就是说,如果有10w的数据,而你需要查的数据为200条,此时是走索引的。但是,如果你查到的结果有5000条,那么,极大可能是不走索引的

稍严谨一些的总结

查询数据时,如果走普通索引,那么会产生回表操作,因为普通索引属于非聚集索引,叶子节点存放的是主键字段的值,拿到主键字段后再去表中根据主键值找到对应的记录。

因此,当数据量很大,而查询数据也很大时,考虑到回表的消耗,就不走索引;

当数据量很大,而查询数据很小,这个时候比起全表扫描,回表的消耗相对少,所以走索引

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

相关文章

  • com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver&n

    大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver 而不是com.mysql.jdbc.Driver,本文主要介绍了com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • InnoDB存储引擎中的表空间详解

    InnoDB存储引擎中的表空间详解

    这篇文章主要介绍了InnoDB存储引擎中的表空间详解,表空间内部,所有页按照区extent为物理单元进行划分和管理,extent由64个物理连续的页组成,表空间可以理解为由一个个物理相邻的extent组成,需要的朋友可以参考下
    2023-09-09
  • MySQL 5.7.19安装目录下创建my.ini文件的方法

    MySQL 5.7.19安装目录下创建my.ini文件的方法

    这篇文章给大家简单介绍了MySQL 5.7.19安装目录下创建my.ini文件的方法,需要的的朋友参考下吧
    2017-08-08
  • mysql 5.7.17 winx64安装配置教程

    mysql 5.7.17 winx64安装配置教程

    这篇文章主要为大家详细介绍了mysql 5.7.17 winx64安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 原来MySQL 数据类型也可以优化

    原来MySQL 数据类型也可以优化

    这篇文章主要介绍了原来MySQL 数据类型也可以优化,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-08-08
  • 对MySQL慢查询日志进行分析的基本教程

    对MySQL慢查询日志进行分析的基本教程

    这篇文章主要介绍了对MySQL慢查询日志进行分析的基本教程,文中提到的Query-Digest-UI这个基于B/S的图形化查看工具非常好用,需要的朋友可以参考下
    2015-12-12
  • 解决MySQL8.0 输入无误仍然提示Access denied问题

    解决MySQL8.0 输入无误仍然提示Access denied问题

    这篇文章主要介绍了解决MySQL8.0 输入无误仍然提示Access denied问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 使用squirrel进行sql拼接不生效问题及解决

    使用squirrel进行sql拼接不生效问题及解决

    这篇文章主要介绍了使用squirrel进行sql拼接不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Mysql存储过程和函数区别介绍

    Mysql存储过程和函数区别介绍

    这篇文章主要介绍了Mysql存储过程和函数的区别,需要的朋友可以参考下
    2014-03-03
  • MySQL优化之分区表

    MySQL优化之分区表

    这篇文章主要介绍了MySQL优化之分区表,需要的朋友可以参考下
    2016-06-06

最新评论