我正在处理一个包含大量行(6 Mil +)的数据库。
此表在两列上有一个复合主键。
它还在每个字段上都有单独的索引,因为有些查询需要这样做。显然,其中一个索引(索引?)是冗余的,并且降低了写操作的性能。
如何找出哪一个是多余的?我知道主键的第一列已经编入索引,无需单独编制索引。那是对的吗?如果有,是否有一个查询我可以运行以找出列表中的第一个?
答案 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上定义了主键。此索引可用于带谓词的查询
但是(至少,我最后一次检查)它不会用于带谓词的查询
优化器只会为查询中的每个表使用一个索引。
正确的索引取决于数据量,数据的基数以及查询中的谓词频率和组合。当您开始添加索引时,存在执行和存储开销,即使只是针对选择操作,设计糟糕的索引也会使查询速度慢于没有索引的情况。