首页 > 解决方案 > 当其中一列具有布尔数据类型时,创建 2 列的复合索引是否有意义?

问题描述

我有 2 列,一列是外键列,另一列是布尔列。两者都在 WHERE 子句中使用。( WHERE foreignId = ? AND approved = TRUE;)。

我知道列的索引在它可以容纳的可能值中没有分配的多样性(例如只有几个选择的布尔值或枚举)无助于加快查询速度。但是,如果您将这样的列/字段与上述外键列一起包含在复合索引中怎么办?生成的复合索引是否足够唯一?还是只为外键列创建索引会更好?

谢谢

标签: mysqldatabaseindexing

解决方案


简短的回答:是的。

长答案:

低基数列(布尔/枚举/等)上的单列索引很少有用。但是包含此类的多列索引可能很有用,有时非常有效。

多列索引中每列的基数(选择性)无关紧要。您将它们放在索引中的顺序无关紧要。

一个非常有效的例子:

WHERE foreignId = ? AND approved = TRUE
ORDER BY foo
LIMIT 10

和...一起

INDEX(foreignId, approved,  -- in either order
      foo)

在这种情况下,它可以完成所有过滤,然后移动到ORDER BY并避免排序。但更重要的是,它可以在 10 行后停止。如果没有该索引,它可能会收集数千行,对它们进行排序,然后剥离 10 行。

外键...确保你有一个复合键,不管你有没有外键。如果您有一个从该列开始的复合索引并且没有创建额外的索引,单列 FK应该注意到。

更多讨论:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql


推荐阅读