枫林在线论坛精华区>>技术交流
[34449] 主题: 问一个建索引的问题
作者: little (渺小)
标题: 问一个建索引的问题
来自: 202.109.*.*
发贴时间: 2002年12月28日 01:40:37
长度: 1180字
如果在数据表TA中有若干个字段A,B,C,D需要建索引,其中A为主键,B,C,
D在数据表查
询时在一个SQL语句中均被使用。

那么B,C,D是单独建3个索引好,还是合在一起建一个索引好呢?
合在一起建索引的时候这三个字段的先后顺序有什么讲究?

如果有两个SQL语句,分别如下:
select * from TA where A=... and B=... and C=... order by D
select * from TA where A=... and C=... order by C desc,B
那么又改如何安排索引才能使查询效率最高呢?
是否应该为每个字段单独设立索引?

其中A,B,C,D都被用到了,假设B,C,D都是integer型的,是有重复项的,那
么它们是各
自单独建索引还是合在一起建一个索引好呢?
我觉得如果把他们三个按照B,C,D的顺序合在一起的话,对第二个查询语句
好像不是太
合适。

还有一种情况就是,假设在上例中B是integer,C和D都是varchar(100),那
么在下面这
个SQL查询中,
select * from TA where A=... and B=... and C='...' and D='...' o
rder by B
如果按照B,C,D的顺序建一个索引应该是比较合适的。
但如果同时有另一个查询
select * from TA where D=... order by D
那么上面的那个查询好像就不是很合适了(因为D在最后面,查询效率低)

在这种情况下,如果单独为D建一个索引,则上面的那个复合索引就有了冗
余项,是否
应该把上面那个索引里面的D去掉呢?(但那样,上面那个查询使用的索引
就不是最优
化的了)


========== * * * * * ==========
作者: leaflet (Leaf闭关中…)
标题: RE:
来自: 61.151.*.*
发贴时间: 2002年12月29日 21:59:12
长度: 883字
(日月光华一网友的解答)

索引建立的目的是为了加快查询(关联)的速度,所以索引的建立要有针
对性,我们
通常是无法建立普适的索引的。所以你首先要明确你的需求,将问题按重
要性依次列
出,然后考虑相应的解决方法。
通常最主要的问题直接决定了数据库的结构,所以影响索引的问题通常处
于相对次要
的位置(这也告诉我们如果可能尽量先优化数据结构)。
找到你的应用中开销最大的sql,针对其建立完整的复合索引方案。
重复上面的过程直到基本没有什么可以改进为止。
也就是说最终在table1上可能形成对A,B,D的单独索引,还可能形成ABC复
合索引和BD
的复合索引。
要注意索引的增加会加大数据库,会主动或被动地影响数据库宝贵的内存
缓存,所以
在有限的内存空间中,索引不可能无限增加。
还要考虑数据的预留,因为索引会随数据的增加而增加。在测试的时候要
对内存的占
用留有余量.
至于ABC还是CBA其实没有关系,通常的数据库引擎在进行查询时候都会自
动进行优化
的,有时候即使少1,2个或多1,2个引擎也会用最接近的索引去匹配的。


========== * * * * * ==========
作者: leaflet (Leaf闭关中…)
标题: RE:
来自: 61.129.*.*
发贴时间: 2002年12月31日 22:28:16
长度: 282字
(我的一个疑问)

在用mysql时,遇到一个同时使用BACD字段的时候按照ABCD的顺序建了一个
复合索引,但
查询速度很慢(耗时是采用BACD顺序复合索引的几倍)。有网友说是因为
数据库查询程序
在查询包含BACD字段的SQL语句时,不会去使用ABCD这个复合索引,所以造
成查询效率低。

不知是不是这个原因

========== * * * * * ==========
作者: leaflet (Leaf闭关中…)
标题: RE:
来自: 61.129.*.*
发贴时间: 2002年12月31日 22:29:17
长度: 226字
(另一位网友的解答)

索引有20%规则
并不是越多越好!

更加准确的说明是单个索引包含的列的数目(字节数)不要超过总列数的
20%,有时候
放宽到30%也是可以的。
但是某个表的所有索引的大小则不受限制,甚至可以超过该表的大小。


========== * * * * * ==========
返回