select count(*) from t_phonebook where phoneno >= ‘321’ and phoneno < ‘321A’
select count(*) from t_phonebook where phoneno like ‘321%’
select count(*) from t_phonebook where substr(phoneno,1,3) = ‘321’
都一样快
1、在索引列上使用函数。如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了。
2、新建的表还没来得及生成统计信息,分析一下就好了
3、基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引。
4、使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,一般大于5%-15%就不走索引而走FTS。
5、单独的>、<。
6、like "%_" 百分号在前。
7、单独引用复合索引里非第一位置的索引列。
8、字符型字段为数字时在where条件里不添加引号。
9、当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
10、索引失效,可以考虑重建索引,rebuild online。
11、B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走、联合索引 is not null 只要在建立的索引列(不分先后)都会走。
答案是 C:
select count(*) from t_phonebook where substr(phoneno,1,3) = ‘321’
A:select count(*) from t_phonebook where phoneno >= '321' and phoneno < '321A'
这个查询利用了号码字段上的唯一索引。通过范围条件(>= '321'和< '321A'),数据库可以利用索引快速定位到以 "321" 开头的电话号码。这种方法通常会非常高效,尤其是在索引已经覆盖了查询条件的情况下。
B:select count(*) from t_phonebook where phoneno like '321%'
这个查询使用了LIKE运算符。虽然LIKE '321%'可以利用索引(如果数据库优化得当),但在某些情况下,LIKE可能会使索引的使用变得不如精确匹配(比如在某些数据库系统中),尤其是当后面跟有通配符%时。
C:select count(*) from t_phonebook where substr(phoneno,1,3) = '321'
这个查询是最慢的,因为substr()函数是在每行数据上执行的,它需要对每个电话号码都进行字符串截取操作。即使创建了索引,substr()会阻止数据库利用索引进行快速检索,导致全表扫描。字符串操作通常会导致查询效率降低,尤其是对于大数据量的表。
D:都一样快
这个选项是错误的。我们已经分析了每种查询方式的效率,显然它们的执行速度不同。
选项 C 执行速度最慢,因为它使用了substr()函数,导致无法有效利用索引,可能会导致全表扫描。而其他两个查询(A 和 B)在能够有效利用索引的情况下,执行速度会更快。