mysql - 当其中一列具有布尔数据类型时,创建 2 列的复合索引是否有意义?
问题描述
我有 2 列,一列是外键列,另一列是布尔列。两者都在 WHERE 子句中使用。( WHERE foreignId = ? AND approved = TRUE;
)。
我知道列的索引在它可以容纳的可能值中没有分配的多样性(例如只有几个选择的布尔值或枚举)无助于加快查询速度。但是,如果您将这样的列/字段与上述外键列一起包含在复合索引中怎么办?生成的复合索引是否足够唯一?还是只为外键列创建索引会更好?
谢谢
解决方案
简短的回答:是的。
长答案:
低基数列(布尔/枚举/等)上的单列索引很少有用。但是包含此类的多列索引可能很有用,有时非常有效。
多列索引中每列的基数(选择性)无关紧要。您将它们放在索引中的顺序无关紧要。
一个非常有效的例子:
WHERE foreignId = ? AND approved = TRUE
ORDER BY foo
LIMIT 10
和...一起
INDEX(foreignId, approved, -- in either order
foo)
在这种情况下,它可以完成所有过滤,然后移动到ORDER BY
并避免排序。但更重要的是,它可以在 10 行后停止。如果没有该索引,它可能会收集数千行,对它们进行排序,然后剥离 10 行。
外键...确保你有一个复合键,不管你有没有外键。如果您有一个从该列开始的复合索引并且没有创建额外的索引,单列 FK应该注意到。
推荐阅读
- jenkins - 詹金斯:PasswordParameterValue.value 需要 String 但收到 Secret
- rdf - 对象属性断言的 Protege 推理
- kubernetes - Kubernetes:如何在开始作业之前测试是否存在具有足够资源的节点
- r - 如何在 Rstudio 中转换日期格式
- javascript - JSX 没有相应的结束标记。ts(17014)
- python - 识别 pandas 数据框中的重叠事件(日期时间记录)
- html - 在移动视图中定位视频叠加层
- sql - 搜索所有包含单词大小并以 a? 结尾的记录
- html - 为什么 content-visibility:auto 在这个简单的例子中不起作用?
- vue.js - VueJS:使用本地文件夹中库中的插件的正确方法?