SQL
什么条件会使用索引?
当字段上建有索引时,通常以下情况会使用索引:
INDEX_COLUMN = ? (
或者
>
、
>=
、
<
、
<=)
INDEX_COLUMN between ? and ?
INDEX_COLUMN in (?,?,...,?)
INDEX_COLUMN like ?||'%'
(后导模糊查询)
T1. INDEX_COLUMN=T2. COLUMN1
(两个表通过索引字段关联)
SQL
什么条件不会使用索引?
1.
经过普通运算或函数运算后的索引字段不能使用索引,如要使用可以使用函数索引。
2.
使用多个字段的组合索引,如果查询条件中第一个字段不能使用索引,那整个查询也不能使用索引。
3.
含前导模糊查询的
Like
语法不能使用索引。
4.
系统在做数值比较时需要将两边的数据转换成同一种数据类型,如果两边数据类型不同时会对字段值隐式转换,相当于加了一层函数处理,所以不能使用索引。
索引使用经验总结如下
:
1.
避免对查询的列的操作
任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。如
:
select
*
from
record
where
substr
(
cardno
,
1
,
4
)
=
'5378'
select
*
from
student
where
sid
*
2
<
4
由于
where
子句中对列的任何操作结果都是在
SQL
运行时逐行计算得到的,因此它不得不进行表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被
SQL
优化器优化,使用索引,避免表扫描,因此将
SQL
重写如下
:
select
*
from
record
where
cardno
like
'5378%'
select
*
from
student
where
sid
<
4
/
2
2.
避免不必要的类型转换
需要注意的是,尽最避免潜在的数据类型转换。如将字符型数据与数值型数据比较,会自动将字符进行转换,从而导致全表扫描。
3.
尽量不要使用前导模糊查询
由于前导模糊查询
(
前面有
%
的
like
查询
)
不能利用索引
,
所以速度会比较慢。如果真要使用前导模糊查询,但速度不能满足要求,可以使用
Lucene
来实现
。
4.
尽量不要使用<>
、!=
、not in
、
<>
、not in
、、
not exists
虽然会使用索引,但不能有效使用索引,它会扫描索引列上的每个数据。所以要尽量转换成其他写法,比如<>1
可以转换成>1 and <1 (
数据库不会这样自动转换来判断是否符合条件)
,这样转换后,在某些情况下可以提高速度。
注:
在DB2(V8
和V9.7)
上测试,!<
和!>
是可以高效利用索引的,它们会被转换成>=
和=<
。
关于索引的谣传:
网上很多地方说下面几种情况不能使用索引,但经过我在
DB2
上的测试,是可以使用索引的。
1.
尽量避免非操作符(包括
!=
、
<>
、
!<
、
!>
、
not in
、
not exists
)的使用。
上面的非操作符都可以利用索引,但
!=
、
<>
、
not in
、
not exists
不能有效利用索引,所以需要将其转换成其它写法。而
!<
、
!>
是可以有效利用索引的。
2.
尽量去掉
IN
、
OR
经过在DB2
上的测试,如果or
的左右两边的列都有索引,则可以利用索引,否则(只有一边的列有索引或者两边都没有索引)不能利用索引。
3.
去掉
Where
子句中的
IS NULL
和
IS NOT NULL
网上有些地方说
B-TREE
索引里不保存字段为
NULL
值记录,因此
IS NULL
不能使用索引。经过在DB2
上的测试,这种说法是错误的。如果null
在整个列所占比例很小,DB2
会先利用索引找到不需要读取出来的数据排除它们,然后读取剩下的数据。同样,is not null
也是会利用索引的。我们需要排除空数据时,用is not null
或者 列名 >= min and
列名 <= max ,
效率是一样的。
分享到:
相关推荐
【合理使用索引技巧】 索引是数据库管理系统中不可或缺的一部分,它主要的作用在于提升查询效率。ISAM(Indexed Sequential Access Method)索引结构是IBM提出的一种常见实现方式,被广泛应用于各种数据库产品中。...
本文主要探讨如何通过合理使用索引来优化SQL Server的性能。 首先,我们来看聚簇索引(Clustered Indexes)。聚簇索引决定了数据在磁盘上的物理排序,一个表只能有一个聚簇索引。由于索引页直接指向数据页,使用聚...
在C#编程中,索引器是一个特殊的功能,它...理解并合理使用索引器,能够提升程序的可读性和效率,尤其在处理大量数据时。在实际开发中,我们需要根据需求灵活运用,同时遵循最佳实践,以确保代码的稳定性和可维护性。
4. **平衡空间和性能**:索引需要额外存储空间,过多的索引可能导致维护成本增加,因此需要合理规划索引数量。 5. **监控和调整**:定期分析数据库性能,监控索引的使用情况,根据实际效果进行调整。 在实际应用中...
当面对复杂的查询或批量更新操作时,合理利用索引提示(Index Hint)成为提升SQL执行效率的关键策略之一。本文通过一个具体的案例,深入探讨了如何通过索引提示优化SQL执行计划,从而解决数据库性能瓶颈。 #### ...
理解索引的工作原理以及如何在SQL语句中合理使用索引,对于提升数据库的性能和效率至关重要。在进行索引设计和查询优化时,需要全面考虑查询模式、索引结构以及数据更新的影响,综合运用各种优化策略以达到最优的...
1. 使用WHERE子句:避免全表扫描,合理使用索引字段进行筛选。 2. 避免索引失效:使用函数、IN操作符、NOT操作符等可能导致索引失效,应尽量让索引列直接参与比较。 3. 选择正确的JOIN策略:了解不同JOIN类型的性能...
合理使用索引能够大幅提升数据库查询的速度。在本文中,我们将探讨几个最常见和最基本的索引使用规则,特别关注联合索引的使用,这是多列索引的一种,可以帮助进一步优化数据库的查询性能。 首先,我们需要了解等值...
- **多表连接**: 在多表连接查询中,合理使用索引可以大幅提高查询速度。 - **索引列的统计信息**: 保持索引列的统计信息最新,有助于优化器做出更好的决策。 #### 二、索引的维护与优化 除了创建合理的索引之外,...
《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。 作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理, ...合理利用索引来高效服务于我们系统。
### 数据库索引 #### 索引的定义 **索引**是在数据库表中用于提高数据检索速度的一种数据...总之,合理使用索引是优化SQL查询的关键。通过了解索引的工作原理和最佳实践,开发人员可以显著提高数据库应用程序的性能。
1. **避免全表扫描**:通过合理使用索引,避免对大数据量表的全表扫描,以减少I/O操作。 2. **使用EXPLAIN PLAN**:分析查询计划,了解数据库如何执行SQL,从而优化查询语句。 3. **减少子查询**:合并子查询为单个...
数据库索引是数据库管理系统中用于加速数据检索的关键结构,它通过对数据库表中一列或多列的值进行排序,使得查询操作能...在设计数据库时,平衡索引的益处和成本,合理利用索引,可以极大地提高数据库系统的整体效率。
3. **合理使用索引** - 建立在经常进行连接的列上,尤其是没有指定为外键的情况。 - 对于频繁排序或分组的列创建索引。 - 不在区分度低的列上创建索引,例如性别列,因为索引维护成本高且效果有限。 - 使用复合...
本文将深入探讨如何正确使用索引,并通过具体案例分析来帮助读者更好地理解索引的作用及其最佳实践。 #### 一、索引的重要性 索引类似于书籍的目录,可以帮助数据库快速定位数据的位置,从而加快数据检索的速度。...
合理利用索引能够显著提升查询效率,但同时也会对系统的性能产生一定影响。 #### 索引的优势 1. **加速查询:**索引能够快速定位到所需的数据行,避免全表扫描,从而极大地提高查询速度。 2. **减少I/O操作:**...
合理使用索引可以显著提升查询效率,但不恰当的索引管理也可能导致性能下降。 **常见的索引调优误区:** 1. **索引并非越多越好:** 过多的索引不仅会增加数据维护成本(如在执行插入、更新和删除操作时),还可能...
"合理创建和使用索引提高Oracle查询效率" 索引是Oracle数据库管理系统中的一种重要数据结构。它可以大大提高查询效率,减少I/O操作。索引可以是B+树索引、簇索引、散列簇索引、反序索引、位图索引和函数索引等多种...