首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

关于目录

2012-07-04 
关于索引为什么当WHERE条件中的左边列利用了函数时,就不会利用索引了呢?比如一个学生表有姓名、学号、性别,

关于索引

为什么当WHERE条件中的左边列利用了函数时,就不会利用索引了呢?

比如一个学生表有姓名、学号、性别,出生日期等列。这些信息放在磁盘的某个地方。这里我暂时称为表A。现在为了查询方便建立出生日期列的索引。这就相当于,建立了只有两列表,这两列为出生日期和该出生日期值对应的完整记录在磁盘(表A存储信息的位置)中位置。并且这个表是根据出生日期排列的,它也放在磁盘的某个地方。这里我称它为表B。

当我们查询学生信息时,如果WHERE条件中有出生日期的条件,那么会先查询这个表B。比如条件为WHERE 出生日期 >1990.1.1,那么就先查询表B中那些行数据的出生日期大于这个值。然后看这些数据对应的完整记录的位置。然后从这些位置读取需要的数据。这样就利用索引来提高了查询速度。

当我们在WHERE条件的左边使用了函数时,比如where ?substr('出生日期',0,4) > 1990时,我们知道出生日期建立了一个索引,也就是表B。我们在表B中取出出生日期的值,然后经过函数运算,再看是否满足条件。注意,经过函数运算后的值我们不能保证是有序的。所以,必须B表中每一列都要经过函数运算再看是否满足条件。这样表B就进行了全表扫描。可是这就失去了利用索引的有序性来筛选提高查询速度的效果,和直接扫描表A得到数据相比,会更慢。有一个经验,如果索引的筛选率小于30%,那么不走索引就更快了。

假如我们将条件变成where ?出生日期 >1990.12.31,那么就可以利用索引了。

所以,尽量避免在WHERE条件表达式的左边使用函数。

如果必须使用函数,那么可以考虑建立函数索引。比如,之前的where ?substr('出生日期',0,4) > 1990。如果建立了substr('出生日期',0,4)这个函数索引,也就是建立了一个表C,其中有两列信息,一列是substr('出生日期',0,4)的值,一列是出生日期对应的完整记录的位置。这样就可以利用索引了。

?

热点排行