2009-11-25 92 views
3

我在列A,B和C上有单独的索引。我想在三列A + B + C上创建一个复合索引。索引创建是否可以使用现有索引?

将我现有指标对综合指数创建有什么影响?数据库会利用它们吗?它们是不相关的,还是会减慢创建新的复合索引的速度?

我正在使用MySql 5.1。

编辑:顺便说一句,表有几百万行。

编辑2:感谢tster您的建议:我想这一点要小得多表(当然只是20000行),但即使是这样一个新的综合指数的创作明显需要较长的时间,当个别指标已经当下。

+0

iirc,MySQL只使用一个索引。我会自己创建覆盖/合成索引,并删除个人的 – 2009-11-25 07:21:30

+0

@OMGPonies:感谢您的评论。你会先丢掉个别的,还是没关系? – davek 2009-11-25 07:23:13

+1

为什么不在那里创建带有三个索引的索引,然后在没有索引的情况下执行相同的操作,并查看是否更快。我的猜测是,扫描三个索引然后将它们合并在一起可能比扫描整个关系更昂贵。 – tster 2009-11-25 07:34:32

回答

6

的MySQL通常重建整个表,当你添加一个索引,因此所有现有的得到重建为好。这可能会很慢。

唯一的例外是使用InnoDB插件添加索引,但没有。

据我所知,它在构建索引时总是进行全表扫描,但如果要添加与另一个索引具有相同(或子集)列的索引,则可以执行索引扫描。这些索引通常仅在列的顺序不同时才有用。

使用库存mysql,您拥有的索引越多,创建新索引的速度就越慢,因为它也会重建现有索引。

随着插件,我认为没有区别。无论哪种方式,如果您打算添加多个索引,您应该一次完成所有索引,而不是一次一个。

+0

@MarkR - +1谢谢你的背景信息:非常有帮助。 – davek 2009-11-25 08:12:10

0

您现有的索引与新索引的创建无关。索引是磁盘上的物理内容,您要求数据库创建一个全新的索引,其结构与现有的索引完全不同。

(警告:我的MySQL,没有具体的知识。)

相关问题