首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

有关数据库索引的几个长期困惑小弟我的有关问题

2012-02-10 
有关数据库索引的几个长期困惑我的问题假设我有一个表myTable:createtalbemyTalbe(idintegernotnullprimar

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


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


是的!对不同数据库结果基本是不一样的。

数据库引擎是否使用你的索引和如何使用索引主要有三方面的原因(假设统计信息及时更新的情况):
1)、数据库引擎是否足够聪明。
2)、你查询返回的记录数与表中记录数的比例关系。
3)、创建索引的字段的选择性高低。

不同数据库产品的聪明程度是不同的,这个聪明程度是指对执行计划编译的合理程度。举个例子,如果你的myTalbe中有100000条记录,假如创建了如下索引:
(1) create index idx_mytable_a on myTable (a)
(2) create index idx_mytalbe_ab on myTable(a, b)

如果查询:
select * from myTalbe where a= 'xxx '
select * from myTable where a= 'yyy ' and b= 'zzz '
将返回1-100左右的数据,数据库引擎决定使用索引查找,我们可以认为这个数据库引擎还算聪明,但是如果返回60000多条还用索引查找,这就是不合理的。因为可能表扫描更合适这种大规模的数据遍历,索引查找耗费的资源可能更大。虽然索引的创建目的就是为了加快查询,但是不合理的使用索引可能效率更慢。你使用的firebird我没接触过,不知道它的智能程度,但是了解索引的运作方式后你也可以在使用中逐渐体验这个数据库产品是否足够聪明,这也是你使用它的一个前提条件。

个人使用经历感觉数据库引擎的聪明程度(个人之见):
中小数据量情况:SQL Server> Oracle> DB2
大数据量:Oracle> SQL Server> DB2

问题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呢?

应该说主流的数据库是建议为这两个查询建立两种顺序的索引,但是随着索引树算法的不断完善以后的数据库产品可能会通用一个即可。


[解决办法]
那么如果我有以下两查询:
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呢?

----------------------
这个问题我知道,建一个就行,这是绝对的。
[解决办法]
在SQL-SERVER中,可以在多列上建立一个索引,这种索引称之为:复合索引。它的建立和单一索引一样。但复合在数据库操作期间所需的开销小,可以代替单一索引的。
[解决办法]
学习

热点排行