范围查找(比如日期范围)下查询出现全表扫描MySQL数据库索引失效
范围查找(比如日期范围)下查询出现全表扫描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数据库索引失效相关推荐
- Mysql查询条件为大于时,不走索引失效问题排查
我们都知道在数据库查询时,索引可以极大的提高查询效率.通常在使用的时候,都会针对频繁查询的关键字段建立索引. 比如,当以交易日期(trans_date)来查询交易记录时,通常会对该字段添加索引,以便在 ...
- MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)
MYSQL避免全表扫描 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断,否 ...
- oracle sql 分区查询语句_oracle11g 表分区后的查询语句如何知道是否进行了全表扫描...
2019-05-10 回答 1. 对返回的行无任何限定条件,即没有where 子句 2. 未对数据表与任何索引主列相对应的行限定条件 例如:在city-state-zip列创建了三列复合索引,那么仅对 ...
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...
- mysql in 子查询无法使用索引全表扫描 慎用in
背景 最近慢sql 性能优化 发现一个调用频率高的sql 使用 in 子查询,导致外层全表扫描的问题? 为什么会产生这样的问题?特别强调在优化的使用发现 使用in 和优化后的效果差距 300倍,可见全 ...
- linux mysql 卸载命令行,mysql卸载命令_Linux下卸载系统自带的MySQL数据库
摘要 腾兴网为您分享:Linux下卸载系统自带的MySQL数据库,永安期货,央视影音,搜狗阅读,瑞易生活等软件知识,以及winulator,不做手机控app,豆瓣电影app,vr网球4,西方世界的劫难 ...
- oracle查询不走索引全表扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle...
使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 什么使用使用Index FFS比FTS好? Oracle 8的Concept手册中介绍: 1. 索引必须包含所有查询中参考到的列. 2. ...
- mysql in和or扫描全表_MySQL对OR条件查询不支持优化,会进行全表扫描
MySQL对OR条件查询不支持优化,会进行全表扫描:explain extended select * from like1 where name like 'abc%';例如:+----+----- ...
- mysql外连接基准表_4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)...
mysql数据库创建,表创建模等模板脚本 --用root用户登录系统,执行脚本 --创建数据库 create database mydb61 character set utf8 ; --选择数 ...
最新文章
- Docker 完全指南
- Android扫描二维码 实现 登录网页
- hdu 3932Groundhog Build Home 【爬山算法】
- Flask实现成绩查询接口
- 给大家介绍一下:网易云信新晋音视频质量诊断专家
- LeetCode_226.翻转二叉树
- 一步步在Kubernetes里运行Web应用
- [原创]从程序员角度分析安徽电信HTTP劫持的无耻行径 - 草根的暂时胜利
- X File 解析中遇到的问题和最终解决办法
- JAVA高并发工作笔记0002---高并发编程之使用ThreadFactory来创建新的线程
- 全球最大电子展2018再度起航,镁客网在香港带你深度探讨人工智能
- Java package 与 import
- gcc/g++/make/cmake/makefile/cmakelists的恩恩怨怨
- jquery实现html表格隔行变色
- Spring源码剖析-Spring核心类认识(一)
- .NET framework 4.0 安装失败的解决方案
- html内编写vbs,HTML_VBS编程教程 (第2篇),第二篇: 我真没想到, - phpStudy
- linux下journalctl日志在哪,journalctl---系统日志
- 关于移动硬盘插入后无显示的问题
- 技能 |【点滴知识】如何在跟催任务时使用EXCEL进度条?