Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为布尔字段编制索引是否会提高性能?_Mysql_Indexing_Innodb - Fatal编程技术网

Mysql 为布尔字段编制索引是否会提高性能?

Mysql 为布尔字段编制索引是否会提高性能?,mysql,indexing,innodb,Mysql,Indexing,Innodb,我正要编写一个查询,其中包含一个,其中isok=1。顾名思义,isok是一个布尔字段(实际上是一个TINYINT(1)无符号,根据需要设置为0或1) 在为该领域编制索引方面是否有任何性能提升?引擎(本例中为InnoDB)查找索引的性能是更好还是更差?实际上,这取决于您运行的查询。但是,通常是的,以及索引任何其他类型的字段。是的索引将提高性能,请检查带索引和不带索引的EXPLAIN的输出 从文档中: 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相

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


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

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

是的索引将提高性能,请检查带索引和不带索引的EXPLAIN的输出

从文档中:

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。桌子越大,成本就越高。如果表中的列具有索引,MySQL可以快速确定要在数据文件中间寻找的位置,而不必查看所有数据。
我认为在这种情况下,可以肯定地说索引不会降低性能,因此您只需从中获益。

不太可能。你应该把它当作一本书来考虑。如果一本书中只有3种单词,并且你对它们进行了索引,那么你的索引页数将与普通页数相同

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

正如MichaelDurrant提到的,这也会使写作速度变慢

编辑:可能的重复:

这里它解释了即使你有一个索引,如果你有太多的记录,它也不会使用索引。 不,通常不会

当字段具有高选择性/基数时,通常会对其进行索引以进行搜索。 在大多数表中,布尔字段的基数很低。
它还将使您的写入速度略微降低。

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

情况A:条件
,其中isok=1
,除此之外没有其他情况:

SELECT *
FROM tableX
WHERE isok = 1
  • 如果索引具有足够的选择性(假设有1M行,只有1k行具有
    isok=1
    ),那么SQL引擎可能使用索引,并且比没有索引时更快

  • 如果索引没有足够的选择性(假设您有1M行,超过100k行有
    isok=1
    ),那么SQL引擎可能不使用索引,而是执行表扫描

案例B:条件
,其中isok=1
和更多内容:

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

然后,这取决于您还有哪些其他索引。
另一列
上的索引可能比只有两个可能值的
isok
上的索引更具选择性。在
(另一列,isok)
(另一列,isok)
上建立索引会更好。

只是为了更好地说明这里的其他几个答案,因为根据我的经验,那些研究类似问题的人与我们是同舟共济的,我们都听说为布尔字段建立索引是毫无意义的,但是


我们有一个大约400万行的表,一次只有大约1000行会标记布尔开关,这就是我们搜索的对象。在我们的布尔字段上添加一个索引可以将查询速度提高几个数量级,从大约9秒多增加到几分之一秒。

这取决于数据的分布

想象一下,我有一本有1000页密密麻麻打印的书,书中唯一的单词是“是”和“否”,反复重复,随机分发。如果我被要求圈出“是”的所有实例,那么在书的后面放一个索引会有帮助吗?视情况而定

如果有一半是和一半不是的随机分布,那么在索引中查找将没有帮助。索引会使这本书变得更大,不管怎样,我会更快地从前面开始,在每一页中查找所有“是”的实例并将它们圈起来,而不是查找索引中的每一项,然后从索引项引用到它所指的页面

但是,如果说,在我那本千页的书中,只有十个“是”的实例,而其他所有的都是数百万个“否”,那么索引将为我节省大量的时间来查找这十个“是”的实例并循环它们


在数据库中也是如此。如果是50:50的分布,那么索引就没什么用了——数据库引擎最好从头到尾地遍历数据(完整表扫描),索引只会使数据库变大,写入和更新速度变慢。但是,如果它是一个类似4000:1的分布(根据本线程中的oucil),那么如果它是您正在寻找的4000项中的1项,则索引查找可以极大地加快它的速度。

看起来像是“是:2-否:1”。这里有人错了,但是谁错了?这不是完全正确的,没有索引mySql需要扫描整个表以找到相关的行。否则它将扫描整个索引。(在大多数情况下都一样长)这假设了正确和错误之间的平均分布。正如@oucil在下面提到的,如果您正在寻找一个非常罕见的布尔值,它可能仍然需要一段时间。不是说你应该总是索引,但我认为在大多数数据库引擎下,数据和查询的性质也很重要。@EdMassey-不,RAM和磁盘中的位置并不是那么简单。所有块(数据或索引)根据需要在缓冲池中“缓存”。因此,任何一个块都可能在内存中,也可能不在内存中。索引会在硬盘上提供大量数据,并使写入速度变慢,因此您不仅可以从中获益。是的,但在这种情况下,如果是
TINYINT(1)UNSIGNED
列,数据的大小将