【问题标题】:What happens if I put index on each column in a table如果我在表中的每一列上放置索引会发生什么
【发布时间】:2013-04-11 02:53:51
【问题描述】:

假设我有一个包含 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?

其中 index 可能是“主键”、“唯一键”或“索引”

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

【问题讨论】:

  • 如果每列都有一个索引,代价就是额外的存储空间和一点点插入和更新的开销。
  • 为什么插入和更新操作会产生开销
  • 当您在包含 60 个索引列的表中插入一条新记录时,您还必须为这 60 个列创建索引条目。 (将索引视为小表,尽管它们通常是树)。

标签: mysql indexing


【解决方案1】:

MySQL's documentation 对此非常清楚(总而言之,在您将在 WHEREJOIN 和聚合函数中使用的列上使用索引)。

因此,在表中的所有列上创建索引本质上没有任何问题,即使它是 60 列。索引越多,插入速度越慢,一些更新将是因为 MySQL 必须创建键,但如果您不创建索引,如果在比较和连接中仅使用非索引列,MySQL 必须扫描整个表。

我不得不说我很惊讶你会这样做

  1. 有一个 60 列的表
  2. JOINWHERE 子句中使用所有这些列,而不依赖于同一个表中的任何其他列

...但这是一个单独的问题。

【讨论】:

  • 我很高兴你的回答,当然我可以说我在 join 或 where 中使用了一半以上的列
【解决方案2】:

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

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

假设你经常使用这个查询:

select * from tablewith60cols where col10 = 'xx';

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

请注意,默认情况下,主键上都有索引,因此当您将表与其他表连接时,您应该使用主键来连接。

【讨论】:

    【解决方案3】:

    添加索引意味着数据库必须维护它,这意味着它必须更新,所以写入越多,索引更新的越多。

    开箱即用创建索引不是一个好主意,仅在需要时创建索引(或者当您可以看到将来需要时...仅当它非常明显时)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 2022-06-23
        • 2011-05-19
        • 2012-01-16
        相关资源
        最近更新 更多