1.select loan_number from account where branch_name = "x" and balance <  1000
2.select loan_number from account where branch_name < "x" and balance =  1000
3.select loan_number from account where balance  < 1000 and branch_name = "x"建立多码索引(branch_name, balance)书上说2的查找:对于字母字母顺序小于X的每个branch_name值,系统定位balance值为1000的那些记录。然而,由于文件中记录的顺序,每条记录可能位于不同的磁盘块,因此导致大量的I/O操作。和1的区别在于第一个属性是比较条件而不是等值条件,这个条件不能对应于搜索码的一个范围查询。
可是按这样说,到底导致这个区别的是因为第一个属性是字符串(不是数值)的原因,还是因为这是多码索引的第一个查找属性的原因(即where后面的第一个搜索条件)呢。如果后者原因的话,是不是按照3的方法也会导致大量的I/O操作?

解决方案 »

  1.   

    组合索引使用的时候有一些辩证的技巧,其中前导列(你这里是branch_name)非常重要,因为如果前导列使用“=”常常能很大程度上缩小查询范围(很多情况是缩小到只剩一条),然后再根据其他的条件来确定过滤出来的记录是否符合条件,这个是由组合索引的构成结构引起的,楼主可以查查相关的资料。而如果使用范围比较,常常范围很大(很多条记录),系统需要遍历所有的记录,要进行的I/O操作很多。因此,我们在建立索引时,要纵观整个程序,尽量将那些使用频率很高的,而且查询是以“=”作为连接符号的列作为组合索引的前导列。你说的第3条推测是有一定的道理的,一般是正确的(之所以说一般,因为不排除1000以下的只有1条,或者很少,这样仍然有很好的过滤效果)。希望说的能帮上楼主理解。