在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来
解决索引失效的问题,但如此一来带来的比如磁盘空间的占用以及列上过多的索引导致DML性能的下降。本文描述的是一个索引列上使用函数使
其失效的案例。
一、数据版本与原始语句及相关信息
1.版本信息
2.原始语句与其执行计划
从执行计划可以看出,SQL语句使用了全表扫描,而where 子句中只有唯一的一列business_date
3.表上的索引信息
从索引的情况上来看有一个基于主键的索引包含了BUSINESS_DATE列,而查询语句并没有走索引而是选择的全表扫描,而且预估所返回
的行Rows与bytes也是大的惊人,cost的值96399,接近10W。
二、分析与改造SQL语句
1.原始的SQL语句分析
SQL语句中where子句的business_date列实现对记录过滤
business_date <= '20110728'条件不会限制索引的使用
SUBSTR(business_date, 1, 6) = SUBSTR('20110728', 1, 6)使用了SUBSTR函数,限制了优化器选择索引
基于business_date列来建立索引函数,从已存在的索引来看,必要性不大
2.改造SQL语句
SUBSTR(business_date, 1, 6) = SUBSTR('20110728', 1, 6)的实质是等于当月,即限制返回的行为从2011.7.1日至2011.7.28
因此其返回的记录大于等于2011.7.1,且小于2011.7.28
做如下改造
business_date >=to_char(last_day(add_months(to_date('20110728','yyyymmdd'),-1)) + 1,'yyyymmdd')
3.改造后的SQL语句
4.改造后的执行计划
改造后可以看到SQL语句的执行计划已经由原来的全表扫描改为执行INDEX SKIP SCAN,但其cost也并没有降低多少
三、进一步分析
1.表的相关信息
2.索引的相关信息
3.尝试在BUSINESS_DATE列上创建索引
建立索引后聚簇因子较小,差不多接近表上块的数量
4.使用新创建索引后的执行计划
从上面的执行计划看出,SQL语句已经选择了新建的索引
尽管返回的rows,bytes没有明显的变化,但cost已经少了近7倍。
分享到:
相关推荐
如果不是按照索引列最左列进行查找(使用过程中跨列使用索引字段),都会导致索引失效。例如,CREATE INDEX idx_column1_column2 ON table (column1, column2),在查询的时候,必须按照索引列的顺序进行查找,例如,...
此外,对索引列进行了隐式转换也可能导致索引失效。另外,索引失效还可能与查询的条件有关,例如在进行范围查询时,MySQL可能无法使用索引。 针对这些问题,可以通过优化查询语句来解决。避免对索引列进行函数操作...
### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...
索引的失效场景包括:更新或删除索引列,使用不带索引的全表扫描操作,使用`SELECT *`而不是明确列出索引列,使用`NOT IN`、`<> ALL()`或`NOT EXISTS`等操作,以及在`WHERE`子句中使用了函数或表达式。此外,索引也...
在索引列上使用函数也会导致索引失效。这是因为在建立索引时,存储的是列的原始值,而非经过函数处理后的结果。 **示例**:设有索引的列名为`name`,执行如下查询: ```sql SELECT * FROM users WHERE LOWER(name)...
### MySQL索引失效的11种情况 #### 知识点概述 在MySQL数据库中,索引是非常重要的优化工具之一,它可以显著加快数据检索的速度。然而,在某些情况下,索引可能会失效,导致查询效率降低。了解这些情况对于优化...
在查询中对索引列应用函数或表达式,如`DATE(column)`,会导致索引失效。MySQL无法使用索引进行计算,因此最好将计算操作移到查询的WHERE子句之外。 **6. 联合索引的顺序** 联合索引的顺序非常重要。如果查询条件中...
3. **范围查询**:如果查询条件包含索引列的范围,如`WHERE column BETWEEN a AND b`,MySQL通常只能使用索引的一部分,导致部分索引失效。 4. **使用否定条件**:如`WHERE column != value`,MySQL可能无法有效地...
1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效 需要重新搜集统计信息 3. 索引本身失效 需要重建索引 下面是一些不会使用到索引的原因 ...
本文将深入探讨如何有效地使用MySQL索引,以及何时可能会导致索引失效。 首先,我们要理解索引的基本原理。索引就像是书籍的目录,它允许数据库快速定位到所需的数据行,而无需逐行扫描整个表。在MySQL中,常见的...
在索引列上使用mysql的内置函数,索引失效。 对索引列运算(如,+、-、*、/),索引失效。 索引字段上使用(!= 或者 ,not in)时,可能会导致索引失效。 索引字段上使用is null, is not null,...
5. **数学运算**:在WHERE子句中对索引列进行数学运算会导致索引失效,因为数据库无法直接通过索引来比较经过计算的值。 6. **函数应用**:在索引列上使用函数,如`DATE()`或`LOWER()`,也会使索引无效,因为索引是...
索引失效是指原本可以利用索引来优化查询的情况却未能利用到索引,导致查询效率降低。 ##### 常见失效场景 - 关联查询中,索引字段与关联字段数据类型不一致。 - 查询条件中字段使用函数(如DATE_FORMAT())。 - ...
在案例中,问题在于对日期字段进行了`TO_CHAR`和`TO_DATE`的转换,这使得已有的函数索引无法发挥效果。解决方法是创建一个新的函数索引,以反映查询中实际执行的转换过程,即`TO_DATE(TO_CHAR(SHOHOU_DATE, '...
Oracle支持多种类型的索引,包括B树索引、位图索引、函数索引和唯一索引等。其中,B树索引是最常见的一种,它通过分层结构快速定位数据行。位图索引则适合于低基数(即某个字段值较少)的列,通过位图方式存储,节省...
2. 避免索引失效:使用函数、IN操作符、NOT操作符等可能导致索引失效,应尽量让索引列直接参与比较。 3. 选择正确的JOIN策略:了解不同JOIN类型的性能差异,如NLJOIN、HASH JOIN和MERGE JOIN。 五、实际应用中的...
本文将深入探讨导致MySQL索引失效的一些常见情况,并提供相应的解决策略。 1. **OR条件的使用**:在查询语句中,如果使用了OR连接不同的条件,即使这些条件分别对应于索引字段,MySQL也可能不会使用索引。解决方法...
2. 避免索引失效:避免在索引列上使用不兼容的操作,如函数、运算符或NULL值,这些会导致索引无法被使用。 3. 分区索引:对于大型表,可以采用分区技术,将数据分成多个逻辑部分,每个部分有自己的索引,提高查询...