枫林在线论坛精华区>>技术交流 |
[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%也是可以的。 但是某个表的所有索引的大小则不受限制,甚至可以超过该表的大小。 |
||
========== * * * * * ==========
|
返回 |