如果我在表中的每列上放置索引会发生什么

时间:2013-04-18 05:47:22

标签: mysql indexing

让我们考虑一下有一个包含60列的表,我需要在该表上执行所有类型的查询,并且还需要将该表与其他表连接起来。我几乎使用所有行来搜索该表中的数据,包括其他表。此表类似于数据库中的主表(如主键)。所以所有表都与此表有关。 通过考虑上面的场景,我可以在表格的每一列上创建索引(60列) ,这是好的做法吗?

用一句话:

Is it best practice to create index on each column in a table ?
What might happens if I create index on each column in a table?

索引可能是“主键”,“唯一键”或“索引”

请评论,如果这个问题对你不清楚,我会尝试改进这个问题。

4 个答案:

答案 0 :(得分:6)

MySQL's documentation非常明确(总结使用您将在WHEREJOIN和聚合函数中使用的列的索引。)

因此,在表中的所有列上创建索引没有任何内在错误,即使它是60列。更多的索引有更慢的插入和一些更新将是因为MySQL必须创建密钥,但如果你不创建索引MySQL必须扫描整个表,如果在比较和连接中只使用非索引列。

我不得不说,我很惊讶你会

  1. 有一个包含60列的表
  2. JOINWHERE子句中使用所有列,而不依赖于同一表中的任何其他列
  3. ......但这是一个单独的问题。

答案 1 :(得分:2)

添加索引意味着数据库必须维护,这意味着必须对其进行更新,因此您拥有的写入越多,索引的更新就越多。

开箱即用创建索引不是一个好主意,只在你需要时创建一个索引(或者你将来可以看到需要的时候......只有在非常明显的时候才能创建索引)

答案 2 :(得分:2)

在表中的每列上创建索引不是最佳做法。

当在where子句中使用列时,索引最常用于提高查询性能。

假设您经常使用此查询:

select * from tablewith60cols where col10 = 'xx';

那么在col10上有一个索引会很有用。

请注意,默认情况下主键有一个索引,因此当您将表与其他表连接时,应使用主键加入。

答案 3 :(得分:1)

在SQL中创建更多索引只会提高搜索速度,同时会导致插入和更新速度变慢,并且还会占用更多存储空间。