mysql 当其中一列具有布尔数据类型时,制作2列的复合索引有意义吗?

yzxexxkh  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(59)

我有2列,一个是外键列,另一个是布尔列。两者都用在WHERE子句中。(WHERE foreignId = ? AND approved = TRUE;)。
我知道,对于那些没有足够多的可能值的列的索引(比如只有几个选择的boolean或enum)无助于加快查询速度。但是如果你把这样的列/字段和前面提到的foreignkey列一起包含在复合索引中呢?得到的复合索引是否足够唯一?或者我只为foreignkey列创建一个索引会更好?
谢谢你

jhdbpxl9

jhdbpxl91#

简短的回答:是的。
详细回答:
对低基数列(boolean / enum / etc)的单列索引很少有用,但包含这种列的多列索引可能有用,有时非常有效。
在多列索引中,每列的基数(选择性)并不重要,也不重要你把它们放在索引中的顺序。
一个非常有效的例子:

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

字符串
连同

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


在这种情况下,它可以完成所有的过滤,然后移动到ORDER BY并避免排序。但更重要的是,它可以在10行之后停止。如果没有索引,它可能会收集数千行,对它们进行排序,然后剥离10行。
Foreign keys.确保你有一个复合键,不管你有没有FK。一个单列FK * 应该 * 注意到你是否有一个复合索引 * 从该列开始 *,而不是创建一个额外的索引。
更多讨论在我的博客:https://mysql.rjweb.org/doc.php/index_cookbook_mysql

相关问题