索引中的列顺序

时间:2018-03-24 07:42:23

标签: mysql indexing query-optimization

我正在处理一个包含大量行(6 Mil +)的数据库。

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

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

如何找出哪一个是多余的?我知道主键的第一列已经编入索引,无需单独编制索引。那是对的吗?如果有,是否有一个查询我可以运行以找出列表中的第一个?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

  

我知道主键的第一列已经编入索引

呃,不,不。主键中的所有列都已编制索引。

关于索引如何工作的解释是在这里扩展帖子的范围,以及在桌面上放置哪些索引方式过于宽泛的问题。

假设您在属性a,b,c上定义了主键。此索引可用于带谓词的查询

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

但是(至少,我最后一次检查)它不会用于带谓词的查询

  • B'/ LI>
  • b和c

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

正确的索引取决于数据量,数据的基数以及查询中的谓词频率和组合。当您开始添加索引时,存在执行和存储开销,即使只是针对选择操作,设计糟糕的索引也会使查询速度慢于没有索引的情况。