范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效

当下MySQL数据库在多款数据库中脱颖而出,成为使用最广泛的数据库之一,这里我们来看看数据库索引上的一个问题。我们知道在数据量上去以后,查询会变得很慢,这是因为数据持久化在磁盘上的,每次查询都需要针对磁盘做IO操作。

针对这种问题,常用的方法之一是建索引,让我们来看看使用MySQL的B-Tree索引时,某个查询场景下即使规范正确地使用了索引也会失败的情况。

例如我这里有一张表:idx_test

create table idx_test
(ID               bigint auto_increment primary key,COUPON_NO        varchar(100),COUPON_RULE_ID   bigint,USER_ID          bigint,STATUS           int,VALID_START_TIME datetime,VALID_END_TIME   datetime
)
索引如下:
create index APP_VALID_INDEX on idx_test (VALID_START_TIME, VALID_END_TIME, USER_ID);
这时候我们使用如下sql来实验,看看索引失效的情况
EXPLAIN
SELECT u.`COUPON_RULE_ID` FROM idx_test u
WHERE u.`VALID_START_TIME` < ?AND u.`VALID_END_TIME` > ?AND `USER_ID` = 1

让我们先来看看一共有几条数据

补充条件参数执行sql发现并没有生效,这是为什么呢

将参数改成 2021-01-18 17:53:01 后发现居然走了索引

经过对比,第一种条件下,第一个索引字段的范围下,几乎包含了所有记录的99%的数据,这个时候等同于全表扫描,所以没有使用索引,而第二种条件下,只有一条数据,所以占比很小。

同时我又查阅了一些资料,MySQL数据库在查询数据条数约占总条数五分之一以下时能够使用到索引,但超过五分之一时,则使用全表扫描了 ,这个五分之一应该可以配置,但不建议,这个数值应该是MySQL查询优化的一个推论值和推荐值。

故我们在建立索引时,应尽可能不去在范围查找的字段上建索引,或者尽可能不把范围查找的字段放在where的第一个,比如上述查询,可以将USER_ID放在第一位,并建立一个USER_ID为第一个的联合索引,不过假设第二个条件下还是有大量的数据被扫描到,那还是相当于只走了USER_ID索引,没有走联合索引。

另外,网友很多有说使用is null来判断时索引不生效,我测试是生效的,后续可以深入了解下这一点

分享到这里就结束了,欢迎大家讨论指正。

范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效相关推荐

  1. Mysql查询条件为大于时,不走索引失效问题排查

    我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...

  2. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

    MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...

  3. oracle sql 分区查询语句_oracle11g 表分区后的查询语句如何知道是否进行了全表扫描...

    2019-05-10 回答 1. 对返回的行无任何限定条件,即没有where 子句 2. 未对数据表与任何索引主列相对应的行限定条件 例如:在city-state-zip列创建了三列复合索引,那么仅对 ...

  4. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  5. mysql in 子查询无法使用索引全表扫描 慎用in

    背景 最近慢sql 性能优化 发现一个调用频率高的sql 使用 in 子查询,导致外层全表扫描的问题? 为什么会产生这样的问题?特别强调在优化的使用发现 使用in 和优化后的效果差距 300倍,可见全 ...

  6. linux mysql 卸载命令行,mysql卸载命令_Linux下卸载系统自带的MySQL数据库

    摘要 腾兴网为您分享:Linux下卸载系统自带的MySQL数据库,永安期货,央视影音,搜狗阅读,瑞易生活等软件知识,以及winulator,不做手机控app,豆瓣电影app,vr网球4,西方世界的劫难 ...

  7. oracle查询不走索引全表扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle...

    使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 什么使用使用Index FFS比FTS好? Oracle 8的Concept手册中介绍: 1. 索引必须包含所有查询中参考到的列. 2. ...

  8. mysql in和or扫描全表_MySQL对OR条件查询不支持优化,会进行全表扫描

    MySQL对OR条件查询不支持优化,会进行全表扫描:explain extended select * from like1 where name like 'abc%';例如:+----+----- ...

  9. mysql外连接基准表_4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)...

     mysql数据库创建,表创建模等模板脚本 --用root用户登录系统,执行脚本 --创建数据库 create database mydb61 character set utf8 ; --选择数 ...

最新文章

  1. Docker 完全指南
  2. Android扫描二维码 实现 登录网页
  3. hdu 3932Groundhog Build Home 【爬山算法】
  4. Flask实现成绩查询接口
  5. 给大家介绍一下:网易云信新晋音视频质量诊断专家
  6. LeetCode_226.翻转二叉树
  7. 一步步在Kubernetes里运行Web应用
  8. [原创]从程序员角度分析安徽电信HTTP劫持的无耻行径 - 草根的暂时胜利
  9. X File 解析中遇到的问题和最终解决办法
  10. JAVA高并发工作笔记0002---高并发编程之使用ThreadFactory来创建新的线程
  11. 全球最大电子展2018再度起航,镁客网在香港带你深度探讨人工智能
  12. Java package 与 import
  13. gcc/g++/make/cmake/makefile/cmakelists的恩恩怨怨
  14. jquery实现html表格隔行变色
  15. Spring源码剖析-Spring核心类认识(一)
  16. .NET framework 4.0 安装失败的解决方案
  17. html内编写vbs,HTML_VBS编程教程 (第2篇),第二篇: 我真没想到, - phpStudy
  18. linux下journalctl日志在哪,journalctl---系统日志
  19. 关于移动硬盘插入后无显示的问题
  20. 技能 |【点滴知识】如何在跟催任务时使用EXCEL进度条?

热门文章

  1. 【冲刺蓝桥杯-真题训练】不同子串、特殊日期、左移右移、卡牌
  2. 枪火重生灵界狂潮攻略(三)兔子流派
  3. CentOS内核版本升级至4.4
  4. 含泪整理最优质SketchBook软件插件素材,你想要的这里都有
  5. web标准,表现与数据分离,web语义化,页面布局和架构
  6. java成员变量何时被回收,以及监听回收
  7. 618过后,一地鸡毛!UB Store助力商家“善后”
  8. 跳跳鱼视频处理大师Mac版,使用方法介绍
  9. vue组件封装技巧,如何对vue模块进行功能封装
  10. 来也携手中通百亿新起点,整装再出发!