查询数据按日期字段作筛选,导致索引失效的情况

查询数据按日期字段作筛选,导致索引失效的情况

1.使用sqoop查询前10天的数据增量,发现耗时很长,大概用了3分钟才查询出来
test_query "
 select count(1) as cnt
 from test.mandpay
 where to_char(updatetime,'YYYY-MM-DD')>to_char(sysdate-10,'yyyy-mm-dd')
"
 2024-12-31 17:51:34,743 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.

------------------------
| CNT                  |
------------------------
| 377075               |
------------------------

date
Tue Dec 31 17:54:48 CST 2024

2.使用sqoop查询前10天的数据增量,几秒钟就查询出来了
test_query "
 select count(1) as cnt
 from test.mandpay
 where updatetime>=TRUNC(SYSDATE-10) 
"
2024-12-31 17:55:44,366 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
------------------------
| CNT                  |
------------------------
| 406545               |
------------------------

date
Tue Dec 31 17:55:50 CST 2024

3.问题原因
updatetime 该字段在业务系统是索引字段,第一种方式对索引字段做了to_char操作,导致索引失效
改成用第二种方式就用上了索引,明显地提升了查询效率


索引失效是指在某些特定条件下,数据库查询无法利用已创建的索引来加速检索过程的现象。这种情况会显著降低查询效率,并可能导致性能瓶颈。下面列举了一些常见的导致索引失效的原因及对应场景: ### 1. **使用函数或表达式操列值** - 当对需要匹配索引字段应用了非确定性的数学运算或其他转换时(如`LOWER()`、`UPPER()`),会使原有的B树结构变得无效。 - 示例:```SELECT * FROM users WHERE LOWER(username) = 'test';``` ### 2. **隐式的类型转换问题** - 如果查询条件中的数据类型与表定义不符,则MySQL可能会自动尝试将两者统一起来比较大小顺序等属性,而这种强制转型往往会绕过现有索引路径。 - 示例:如果id是字符串类型的主键却传入整数为过滤项——```SELECT * FROM orders WHERE id=98765;``` ### 3. **LIKE模式匹配开头通配符(% 或 _)** - 使用前缀百分号(`%`)搜索文本串内容时,引擎难以预知后续字符组合情况,因此不得不放弃依赖常规排序机制查找目标记录位置的方式转而遍历整个结果集寻找符合条件者。 - 示例:```SELECT title FROM books WHERE title LIKE '%abc';``` ### 4. **范围查询联合其他精确筛选字段未合理规划复合索引次序** - 假设我们有一个包括日期区间和类别标签两部分组成的多重条件限定任务,但由于设计失误先针对后者建立了单一维度二级指引再附加前者构建三叉枝叶关系图谱的话,在实际运行过程中很可能只有一侧被有效激活而已。 ### 5. **过多的OR连接逻辑断开连续性关联线索链条** - 每当存在多个分支选项并通过布尔算子串联起来形成最终判定依据的时候,除非各个片段都能够独立享受到各自专属定制化的辅助导航设施支持之外别无他法,否则整体流程必然退化成全量扫描处理手段加以应对局面。 为了避免上述提到的各种情形所带来的负面影响,开发者应当密切关注自身SQL书写习惯并且善于运用EXPLAIN关键字深入剖析背后隐藏的秘密工机制原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值