索引布尔字段是否有任何性能提升?


Answers:


79

并不是的。您应该像书一样思考它。如果一本书中只有3种单词并且您对它们全部都进行了索引,则您将拥有与普通页面相同数量的索引页面。

如果一个值的记录相对较少,则性能会有所提高。例如,如果您有1000条记录,其中10条为TRUE,那么如果使用isok = 1

正如迈克尔·杜兰特(Michael Durrant)所说,这也会使写入速度变慢。

编辑:可能的重复:索引布尔字段

在这里,它说明即使有索引,但如果有太多记录,它也不会使用索引。 MySQL在检查= 1时不使用索引,而在= 0时使用


4
看起来像是“是:2-否:1”。这里有人错了,但是谁呢?
Niet the Dark Absol

4
这不是完全正确的,没有索引mySql需要扫描整个表以找到相关的行。
ilanco

4
否则它将扫描整个索引。(在大多数情况下都是一样长的时间)
迈克尔·科珀

1
它可以有所作为。仅通过添加索引就可以将查询的执行时间缩短一半,而写入又很少又便宜,因此我们根本不在乎代价。与所有内容一样,不要假设,测量(也是因为数据库实际上并不总是像您在逻辑上期望的那样行为)
Eelco 2015年

6
假设TRUE和FALSE之间分布相等。如下面的@oucil所述,如果您要查找的布尔值非常少,则可能还需要一段时间。并不是说您应该始终建立索引,但是我认为您的数据的性质和查询在大多数数据库引擎下也很重要。
mahemoff

117

只是为了在这里给出其他几个答案更好的一点,因为根据我的经验,那些正在考虑类似问题的人和我们一样,我们都听说索引布尔字段是没有意义的,但是...

我们有一个表,该表包含约400万行,一次只能标记约1000个左右的布尔开关,这就是我们要搜索的内容。在我们的布尔字段上添加索引可以使查询加速几个数量级,它的时间从大约9+秒缩短到了几分之一秒。


是的,虽然您应该最终尝试理解事物的``原因'',但请始终与实际数据一起进行测量并尝试不同的事物,以查看您的理论是否与db引擎的实际行为相匹配(您会感到惊讶... )
Eelco 2015年

8
@Eelco是的,但是在这种情况下,结果实际上与基本理论相符。仅当您大约有50%的可能遇到与您的搜索匹配的项目时,才可以忽略不计的基本想法才有意义。然后,要找到100个匹配项,数据库需要迭代200个项目。但是,如果项目仅匹配1%的时间,则需要迭代10,000个项目。
mahemoff

7
我喜欢人们实际在现场进行尝试并给出性能提升反馈,而不仅仅是哲学思考。
维克多·乔拉斯

WHERE my_col > 0 而不是my_col = 1似乎也有助于提高速度
亚伦

27

它取决于实际查询和索引/查询组合的选择性。

案例A:情况WHERE isok = 1,那里没有其他东西:

SELECT *
FROM tableX
WHERE isok = 1
  • 如果索引具有足够的选择性(例如您有1M行,只有1k行isok = 1),则SQL引擎可能会使用索引,并且比没有索引时要快。

  • 如果索引的选择性不够好(例如您有1M行,而有超过100k行isok = 1),则SQL引擎可能不会使用索引并进行表扫描。

情况B:条件WHERE isok = 1和更多内容:

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

然后,这取决于您拥有其他哪些索引。索引on another_column可能比索引isok只有两个可能的值更具选择性。(another_column, isok)或的索引(isok, another_column)会更好。


我认为,与头一个答案相比,这是更正确的答案。还有数据的分布。
蒂安

12

这取决于数据的分布。

想象一下,我有一本书,其中有1000个紧密键入的页面,而书中唯一的单词是“ yes”和“ no”,一遍又一遍地重复并随机分布。如果要求我圈出“是”的所有实例,书后的索引是否有帮助?这取决于。

如果存在是和否的一半随机分布,那么在索引中查找将无济于事。索引会使书变大得多,无论如何,我会更快地从头开始,并逐步浏览每一页以查找所有“是”实例并圈出它们,而不是查找其中的每个项目。索引,然后将引用从索引条目中获取到它所引用的页面。

但是,如果说在我的一千页的书中只有十个“是”的实例,而其他所有内容仅仅是数百万个“不是”,那么索引将为我节省寻找十个“是”的实例并将其圈出的时间。

在数据库中也是一样。如果是50:50的分布,则索引将无济于事-数据库引擎最好只是从头到尾遍历数据(全表扫描),而索引只会使数据库更大,并且编写和更新速度较慢。但是,如果它类似于4000:1分配(按照该线程中的oucil的关系),则索引查找可以极大地加快它的速度,如果它是您要查找的4000个项目中的1个。


5

不,通常不是。

当字段具有高选择性/基数时,通常会为它们建立索引以进行搜索。在大多数表中,布尔字段的基数非常低。这也会使您的写入速度变慢。



2

是的,索引会提高性能,请检查有无索引的EXPLAIN的输出。

从文档:

索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行。桌子越大,花费越多。如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。

我认为也可以肯定地说,在这种情况下,索引不会降低性能,因此您只需从中受益。


2
索引会在硬盘上提供大量数据,并且使写入速度变慢,因此您不仅会从中受益。
Michael Koper

1
的确如此,但是在这种情况下,如果是一TINYINT(1) UNSIGNED列,数据的大小将很小。
ilanco

而且增加的写入开销可能很低
Eelco 2015年

索引的大小不是随指向的行数而增加,而不仅仅是索引字段的大小吗?
poolie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.