今天一个学员在群里问了我一道面试的题目:


TEST表有两个列:a和b。如果a和b上已经有了复合索引,还能不能在a上建立索引?如果可以,那么查询的时候,是走复合索引还是单一索引?


这是爱奇艺的一道面试题。


下面是我的回复:

**************************************************************

你的两个问题,1、可不可以建多个索引?2、查询的时候,走哪个索引?

我以Oracle数据库回答一下。


问题一:可以在一个列上建多个索引。但不建议这么做,这会增加数据库维护的成本,反而使得查询性能下降。


问题二:答案是不一定。这取决于Oracle优化器如何生成SQL的执行计划。关于优化器,我解释一下。Oracle有两种优化器:RBO和CBO。RBO是基于规则生成执行计划,需要事先人为建立相应的规则;CBO是基于成本生成执行计划,这种优化器会在多个执行计划中选择一个成本最低的执行计划。Oracle现在的默认都是CBO的方式。至于如何查看成本信息,需要查询Oracle的数据字典获取相应的统计信息才可以。


这两个问题涉及到了数据库的优化,说起来就比较复杂了。51cto上有我的课程专门讲数据库的性能优化。如果你还不清楚,也可以加我好友,我再给你解释。

**************************************************************