有关数据库索引的几个长期困惑我的问题
假设我有一个表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)