【问题标题】:Order of columns in an index索引中列的顺序
【发布时间】:2018-03-24 07:42:22
【问题描述】:

我正在处理具有大量行(6 百万+)的数据库。

此表在两列上有一个复合主键。

它还在每个字段上都有单独的索引,因为有些查询需要这样做。显然,这些索引之一(索引?)是多余的,并且会降低写入操作的性能。

我如何找出哪一个是多余的?我知道主键的第一列已经被索引,不需要单独索引。那是对的吗?如果是这样,我可以运行一个查询来找出列表中的第一个吗?

【问题讨论】:

  • 您没有问正确的问题 IMO。您添加这些索引是有原因的。原因是什么?为什么不添加一个涵盖两列的真正复合索引?
  • 正如我所说,各种查询都需要这些索引,因此毫无疑问,我们需要两列上的索引。但是,如果复合索引也可以用作其中一列的索引,那么我不需要分别在两列上创建单独的索引。看这张图来说明情况:i.imgur.com/NrsOa0q.png 现在,我的问题是一个索引似乎是多余的。如何找到哪一个?
  • 我的理解是,如果您在(a, b) 上有一个复合索引,那么它也适用于单独的a,但不适用于b
  • 这就是我的想法。在这种情况下,我如何找出哪一个是 a 列。我不想依赖 phpmyadmin 告诉我的内容。
  • 使用SHOW INDEX。你不能自己搜索这个吗?

标签: mysql indexing query-optimization


【解决方案1】:

SHOW INDEXES FROM tablename 将包含一个Seq_in_index 列,它告诉您哪个是第一列(也就是最左边),第二列等等。

因此,对于Seq_in_index 列出的值为1 的列是不需要它自己的单列索引的列。

您也可以使用SHOW CREATE TABLE tablename查看从左到右列出的索引,正确显示的顺序代表索引中列的顺序。

【讨论】:

  • 谢谢。这就是我想确保可靠的东西。
【解决方案2】:

SHOW CREATE TABLE tablename 按既定顺序为您提供所有索引。

您不需要INDEX(a),因为其中的列是INDEX(a,b) 中的第一列,

这适用于(a,b) 中的INDEX / UNIQUE / PRIMARY KEY

【讨论】:

    【解决方案3】:

    我知道主键的第一列已经被索引了

    嗯,不。主键中的所有列都被索引。

    关于索引如何工作的解释扩大了此处帖子的范围,而将哪些索引放在您的表格上的问题方式太宽泛了。

    假设您在属性 a、b、c 上定义了一个主键。该索引可用于带有谓词的查询

    • 一个
    • a 和 b
    • a 和 b 和 c

    但是(至少,我上次检查时)它不会用于带有谓词的查询

    • b
    • b 和 c

    优化器只会为查询中的每个表使用一个索引。

    正确的索引取决于数据量、数据的基数以及查询中谓词的频率和组合。当您开始添加索引时,会产生执行和存储开销,即使只是针对选择操作,设计不良的索引也会使您的查询比没有索引时运行的要慢。

    【讨论】:

    • 这就是我说在“a”上添加单独的索引是多余的。我的问题是,如果我“显示索引”会按顺序显示索引,或者我需要做什么具体的事情。我想我只是让它变得比现在更难,并且显示索引应该有效。
    猜你喜欢
    • 2010-12-22
    • 2011-05-14
    • 2017-03-12
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2011-01-18
    • 2011-01-12
    相关资源
    最近更新 更多