索引一个布尔字段有什么性能提升吗?

我正要写一个包含 WHERE isok=1的查询。顾名思义,isok是一个布尔字段(实际上是根据需要设置为0或1的 TINYINT(1) UNSIGNED)。

在为这个领域建立索引方面是否有任何性能提升?引擎(本例中为 InnoDB)查找索引的性能是更好还是更差?

64604 次浏览

实际上,这取决于您运行的查询。但是,通常是的,以及索引任何其他类型的字段。

是的,索引可以提高性能,检查 EXPLAIN 的输出,包括索引和不包括索引。

来自文件:

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

我认为在这种情况下,也可以说一个指数不会有 减少的性能,所以你只能从中获益。

没有。你应该把它想成一本书。如果一本书中只有3种单词,而你索引了所有的单词,那么你的索引页数将与普通页数相同。

如果只有一个值的记录相对较少,那么性能就会提高。例如,如果您有1000条记录,其中10条为 TRUE,那么如果您使用 isok = 1进行搜索,那么它将非常有用

正如 MichaelDurrant 所提到的,它也使写作变慢。

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

这里它解释说,即使你有一个索引,如果你有太多的记录,它不使用索引反正。 MySQL 在检查 = 1时不使用 index,而是在检查 = 0时使用 index

不,通常不会。

当字段具有高选择性/基数时,通常对它们进行索引以进行搜索。 在大多数表中,布尔字段的基数非常低。 这也会使你的写作稍微慢一点。

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

案例 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

然后,它取决于您有哪些其他索引。another_column上的索引可能比 isok上的索引更具选择性,因为 isok只有两个可能的值。(another_column, isok)(isok, another_column)的指数会更好。

只是为了更好地回答这里的其他几个问题,因为根据我的经验,那些研究这样的问题的人和我们处在同一条船上,我们都听说过索引布尔字段是毫无意义的,但是..。

我们有一个大约有400万行的表,一次只有大约1000行左右会有一个布尔开关被标记,这就是我们要搜索的内容。在我们的布尔字段中添加一个索引按数量级加快了查询速度,它从大约9秒多变成了几分之一秒。

这取决于数据的分布。

想象一下,我有一本有1000页密集打印的书,书中只有“是”和“不是”这两个词,一遍又一遍地重复,并且随机分配。如果我被要求圈出所有“是”的实例,书后面的索引会有帮助吗?看情况。

如果有一半和一半的是和否的随机分布,那么在索引中查找不会有帮助。索引会让书变得更大,无论如何,我会更快地从前面开始,在每一页寻找所有的“是”的实例,然后把它们圈起来,而不是查找索引中的每一个条目,然后把索引条目中的参考文献带到它所指向的页面。

但是,如果在我的千页书中只有10个“是”的例子,而其他的都是数以百万计的“不”,那么一个索引就可以帮我节省大量的时间来找到这10个“是”的例子,然后把它们圈起来。

数据库里也是一样。如果它是一个50:50的发行版,那么索引不会有任何帮助——数据库引擎最好从头到尾(全表扫描)查看数据,而索引只会让数据库变大,写入和更新速度变慢。但是如果是4000:1的分布(根据这个线程中的 委员会) ,那么索引搜索可以大大加快速度,如果它是你正在寻找的4000件物品中的1件。

索引只是一张地图。检索将 is _ xxx 设置为 true 的所有行是 O (1)。如果你需要扫描整个表,并根据其中的每一行(O (n))检查这个谓词

是的, 对于两个值,我们假设基数是1:100,也就是说,对于1 true,有100个假列,那么增益将是显著的。 在我的一个表中,比例是1:10000,表是膨胀的,即大量的 jsons 和 HTML (64KB)出现在列中,带索引的 select * 查询将基数为1的数据的查询时间从10秒提高到1ms。