【问题标题】:MySQL Unnecessary IndexesMySQL 不必要的索引
【发布时间】:2012-08-16 20:57:09
【问题描述】:

如果我有这个索引:

(col1, col2, col3)

我知道搜索 (col1); 时会有所帮助; (col1, col2); (col1, col2, col3)。

如果我用完全相同的列创建另一个索引,phpMyAdmin 会警告我其中一个索引可能会被删除,因为它们是相同的。

但是,如果我有这些索引:

(col1, col2, col3)

(col1, col2)

(col1)

phpMyAdmin 根本不会警告我。

所以我的问题是,最后两个索引在任何情况下都是必需的吗?我认为只有第一个索引就足够了

谢谢。

【问题讨论】:

  • 最后2个索引不是必须的。
  • 我们不知道它们是否有必要不看表结构。如果它们是唯一键或主键或其他任何内容,则无法删除它们。需要更多信息来回答问题的第二部分。 SHOW CREATE TABLE 表名\G
  • @randymelder - 我不是在谈论 UNIQUE 或 PRIMARY 键。我说的是常见的列。我知道你提到的那些人需要存在。谢谢。
  • @JustinDanielson - 谢谢你的回答。

标签: mysql


【解决方案1】:

MySQL 将只使用一个索引(最左边的)来优化搜索。引用文档:

If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to find rows. For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3).

但是,如果有任何索引是唯一的,那么它们可能有充分的理由存在。

如果您在分析过程中发现任何列经常彼此分开使用,那么您应该考虑为每个列添加单独的索引以优化这些查询。

例如

ALTER TABLE tablename ADD INDEX (col1), ADD INDEX (col2), ADD INDEX (col3);

【讨论】:

  • 从你的回答来看,我认为我在这个问题上的观点是正确的。我知道我可能必须创建不同的索引,其中最左边的前缀不同。 UNIQUE 和 PRIMARY 也是如此。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多