我有2列,一个是外键列,另一个是布尔列。两者都用在WHERE子句中。(WHERE foreignId = ? AND approved = TRUE;)。我知道,对于那些没有足够多的可能值的列的索引(比如只有几个选择的boolean或enum)无助于加快查询速度。但是如果你把这样的列/字段和前面提到的foreignkey列一起包含在复合索引中呢?得到的复合索引是否足够唯一?或者我只为foreignkey列创建一个索引会更好?谢谢你
WHERE foreignId = ? AND approved = TRUE;
jhdbpxl91#
简短的回答:是的。详细回答:对低基数列(boolean / enum / etc)的单列索引很少有用,但包含这种列的多列索引可能有用,有时非常有效。在多列索引中,每列的基数(选择性)并不重要,也不重要你把它们放在索引中的顺序。一个非常有效的例子:
WHERE foreignId = ? AND approved = TRUEORDER BY fooLIMIT 10
WHERE foreignId = ? AND approved = TRUE
ORDER BY foo
LIMIT 10
字符串连同
INDEX(foreignId, approved, -- in either order foo)
INDEX(foreignId, approved, -- in either order
foo)
型在这种情况下,它可以完成所有的过滤,然后移动到ORDER BY并避免排序。但更重要的是,它可以在10行之后停止。如果没有索引,它可能会收集数千行,对它们进行排序,然后剥离10行。Foreign keys.确保你有一个复合键,不管你有没有FK。一个单列FK * 应该 * 注意到你是否有一个复合索引 * 从该列开始 *,而不是创建一个额外的索引。更多讨论在我的博客:https://mysql.rjweb.org/doc.php/index_cookbook_mysql
ORDER BY
1条答案
按热度按时间jhdbpxl91#
简短的回答:是的。
详细回答:
对低基数列(boolean / enum / etc)的单列索引很少有用,但包含这种列的多列索引可能有用,有时非常有效。
在多列索引中,每列的基数(选择性)并不重要,也不重要你把它们放在索引中的顺序。
一个非常有效的例子:
字符串
连同
型
在这种情况下,它可以完成所有的过滤,然后移动到
ORDER BY
并避免排序。但更重要的是,它可以在10行之后停止。如果没有索引,它可能会收集数千行,对它们进行排序,然后剥离10行。Foreign keys.确保你有一个复合键,不管你有没有FK。一个单列FK * 应该 * 注意到你是否有一个复合索引 * 从该列开始 *,而不是创建一个额外的索引。
更多讨论在我的博客:https://mysql.rjweb.org/doc.php/index_cookbook_mysql