日期:2014-05-19  浏览次数:20370 次

有关数据库索引的几个长期困惑我的问题
假设我有一个表myTable:
create   talbe   myTalbe
(
    id   integer   not   null   primary   key,
    a   varchar(1000)   not   null,
    b   varchar(1000)   not   null,
    ....其它字段未列出
);
假设这个表的数据非常大,   为了便于查询,   需建立索引.
假设常用的查询有两个:
select   *   from   myTalbe   where   a= 'xxx '
select   *   from   myTable   where   a= 'yyy '   and   b= 'zzz '

问题1:   是不是有必要建立两个索引:
(1)   create   index   idx_mytable_a   on   myTable   (a)
(2)   create   index   idx_mytalbe_ab   on   myTable(a,   b)
还是因为索引(2)已经包含索引(1)了,   因此索引(1)就可以不用建了?
这个问题我问了些人,   回答各不一样,   在此想问一下是否对不同的数据库答案不一样?   我现在用的是firebird,   有谁对此有经验的?

问题2:   索引不仅可以加速Where条件的查询,   对order   by   也是可以加速的吧?   如上面的索引(1),   可以加速查询:   select   *   from   myTable   order   by   a

问题3:   如果问题2是肯定的(我想应该是的),   那么如果我有以下两查询:
select   *   from   myTable   order   by   a
select   *   from   myTalbe   order   by   a   desc
是否有必要建立两个索引:
create   index   idx_mytable_a   on   myTalbe   (a);
create   index   idx_mytable_adesc   on   myTalbe   (a   desc);
还是只要建立其中一个就可以了?   是不是不同的数据库答案也不一样?   那Firebird呢?




------解决方案--------------------
up
------解决方案--------------------
经典的提问,我也很糊涂这些问题,留名标记。up up。
终于决定了,待会儿去书店买邹老大的书,我查询了,书店就剩下1本了!动作要快啊,仔细研读之。 ^_^
------解决方案--------------------
UP一下,学习
------解决方案--------------------
我的理解:
问题1:
create index idx_mytalbe_ab on myTable(a, b)可以时查询
select * from myTalbe where a= 'xxx '
select * from myTable where a= 'yyy ' and b= 'zzz '
都有帮助,必须注意a,b字段的顺序:select * from myTable where b= 'yyy ' and a= 'zzz '
这样就用不上索引了。另外在a,b字段上添加函数也会使索引失效。

问题2:
索引对于使用order by或group by+索引字段的查询都有效果。

问题3:
如果表的索引字段的排序与索引排序一致,那么对于优化查询肯定有更好的效果。

------解决方案--------------------
比起MySQL又什么优势?现在开源数据库基本上都是MySQL一统天下啊
------解决方案--------------------
牛人,我见识一下!
------解决方案--------------------
Firebird听都没听过,
还是要先了解一下这个数据库的原理才能明白
------解决方案--------------------
1.建立复合索引create indext indexname on table tname (a,b) , a在前,b在后.

select * from myTable where b= 'yyy ' and a= 'zzz '
说明:where条件里列的先后顺序不会影响索引.

------解决方案--------------------
个人意见:
1,都建立应该在查询上会快些,但会影响其他操作;
2,是
3,索引的升降序意义相当,建一种就OK了
------解决方案--------------------
问题1:不用建2个索引,只须建立一个a、b聚簇非唯一的复合索引就行了
问题2:索引会提高查询速度,但同时会影响更新(Update/Insert)表的速度
问题3:只用建立一个索引就行了
------解决方案--------------------
你的问题比较有代表性,代替基础版的版主答一下。

问题1: 是不是有必要建立两个索引:
(1) create index idx_mytable_a on myTable (a)