索引创建可以使用现有的索引吗?

3
我有单独的索引,例如列A、B和C。我想在这三列A+B+C上创建一个组合索引。现有的索引会对组合索引的创建产生什么影响?数据库是否会利用它们,它们是否无关紧要,或者它们是否会减慢我的新组合索引的创建速度?我正在使用MySql 5.1。 编辑:顺便说一下,表格有数百万行。 编辑2:感谢tster的建议:我在一个小得多的表格上试过了这个方法(诚然只有20,000行),但即使在这种情况下,如果已经存在单独的索引,则创建新的组合索引也需要花费更长的时间。

如果我没记错的话,MySQL 只使用一个索引。我会自己创建覆盖/组合索引并且删除单独的索引。 - OMG Ponies
@OMGPonies:感谢您的评论。您会先放弃个别的,还是无所谓呢? - davek
1
为什么不使用这三个索引创建索引并计时,然后再在没有这些索引的情况下执行相同的操作,看看哪一个更快。我猜测不会有任何区别,因为扫描三个索引,然后将它们合并在一起可能比扫描整个关系更昂贵。 - tster
我觉得很惊奇,使用单独的索引需要更长时间。我非常好奇为什么会这样。 - tster
“几百万行”听起来并不算太多,你可能可以在30分钟内重建表格(取决于你的确切数据)。困难的是需要花费数小时来创建索引的情况。如果表格适合内存,创建索引相对较快。你的服务器应该有足够的内存来容纳“几百万行”的表格。 - MarkR
2个回答

6

MySQL通常在添加索引时会重建整个表,因此所有现有的索引也会被重建。这可能很慢。

唯一的例外是使用InnoDB插件添加索引,它不会这样做。

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

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

使用插件,我认为不会有什么区别。

无论哪种方式,如果您计划添加多个索引,则应一次性完成而非逐个添加。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接