首页 > 试题广场 >

电话号码表t_phonebook中含有100万条数据,其中号

[单选题]
电话号码表t_phonebook中含有100万条数据,其中号码字段PhoneNo上创建了唯一索引,且电话号码全部由数字组成,要统计号码头为321的电话号码的数量,下面写法执行速度最慢的是___
  • 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’
  • 都一样快
A选项。我想问下phoneno<'321A'什么意思。
发表于 2016-02-12 12:21:31 回复(3)
like的模糊查询子匹配前三个字符在,在大量的数据情况下,效率很高
发表于 2015-05-05 17:00:51 回复(0)
通配符查找都是相对较快的,可以直接匹配,通配符有百分号“%”匹配任意、下划线“_”匹配单个字符
发表于 2016-03-02 15:15:46 回复(0)
这道题,分析思路是从索引是否失效出发!
A:使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,一般大于5%-15%就不走索引而走FTS(全表扫描)。所以A可能索引失效也可能不失效。
C: 在索引列上使用函数。如SUBSTR,DECODE,INSTR等,对索引列进行运算,索引失效。
    需要建立函数索引就便可以解决。
所以选择:C是最慢的!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~····
http://blog.163.com/card_2005/blog/static/117810368200981010220275/
容易引起oracle索引失效的原因很多:

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 只要在建立的索引列(不分先后)都会走。

发表于 2015-09-09 14:33:50 回复(3)
like模糊查询中,右模糊(321%)查询会使用索引,而%321和%321%会放弃索引而使用全局扫描。所以b不慢的
发表于 2015-07-09 09:14:00 回复(2)
C
采用函数处理的字段不能利用索引,例如substr()
发表于 2015-05-06 08:22:44 回复(3)
利用右模糊查询可以使用索引,如果字段采用函数处理则不使用索引; A选项有可能使用索引也有可能不使用索引; 所以C执行效率最慢。 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)      注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引   2.对于多列索引,不是使用的第一部分,则不会使用索引   3.like查询是以%开头   4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引      5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
编辑于 2016-01-21 09:28:51 回复(0)
一定要注意,采用函数的字段不能利用索引,在查找的时候要全部扫描数据。
发表于 2016-06-02 16:04:57 回复(0)
我来当一回机器人,这是4o老师的回答

答案是 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)在能够有效利用索引的情况下,执行速度会更快。


发表于 2024-12-06 14:43:33 回复(0)

在索引列上使用函数,如substr decode等,索引失效

编辑于 2019-08-26 15:47:27 回复(0)
探究是否索引失效,在索引列上使用函数。如SUBSTR,DECODE,INSTR等,对索引列进行运算,索引失效。
发表于 2019-08-20 15:22:10 回复(0)
数据库查询数据与数据索性失效有关,而含有函数的索性会失效
发表于 2017-03-29 22:42:14 回复(0)
函数处理的字段不能使用索引所以索引失效会比较慢
发表于 2016-10-06 09:55:40 回复(0)