我可以安全地索引 MySQL 中表的所有列吗?

Som*_*luk 5 mysql myisam performance index

我有一张有 4 列的桌子。一列是主键,其他三列是对其他表列的引用。我在这四个表上使用连接作为搜索过滤器。这些连接需要时间。

所以我想在列上建立索引,因为我读到我应该在连接条件的列上创建索引。我的问题是如果表的所有列都被索引会有问题吗?有没有其他方法可以降低这些搜索过滤器的时间复杂度。

更多提示:

  • 表1(主搜索)-10亿个条目primary_key fk1 fk2 fk3
  • 表2-8亿条目pk1 ..(8-9列)
  • 表3-7亿条目pk2 ..(10-12列)
  • 表2-8.5亿条目pk3 ..(7-8列)

我正在使用 MyISAM 引擎。

Rol*_*DBA 3

当涉及到查询时,表的索引永远不应该是您首先关心的问题。

您计划使用的查询应该决定您需要的索引。

根据查询,某些列可以单独建立索引。其他查询需要复合索引。andORDER BY子句GROUP BY应该为要创建的索引提供即时提示。不使用此类提示可能会导致临时表排序,而不是按所需顺序使用数据索引。

列值的低基数应该消除对索引的需要。

即使考虑到这些因素,您可能会发现查询可能需要一些调整(也称为重构)来提高性能。

当您达到拥有正确索引的程度时,您不必担心这些索引的大小。对于 MyISAM 表,这意味着 .MYI 文件可能会显着增长。

现在应该根据查询的性能权衡索引文件的大​​小以及索引的数量,特别是如果索引提供正确的数据排序和最快的检索。

查询的解释计划可能会随着时间的推移而变化,具体取决于行数、列基数、DELETE 和 UPDATE 的数量。一旦查询的解释计划与几个月前的情况发生变化,您应该探索是否需要添加或删除索引。