我将要编写一个包含的查询WHERE isok=1
。顾名思义,isok
是一个布尔字段(实际上是a TINYINT(1) UNSIGNED
,根据需要设置为0或1)。
索引该字段是否有任何性能提升?引擎(在这种情况下为InnoDB)在查询索引方面会表现得更好还是更差?
我将要编写一个包含的查询WHERE isok=1
。顾名思义,isok
是一个布尔字段(实际上是a TINYINT(1) UNSIGNED
,根据需要设置为0或1)。
索引该字段是否有任何性能提升?引擎(在这种情况下为InnoDB)在查询索引方面会表现得更好还是更差?
Answers:
并不是的。您应该像书一样思考它。如果一本书中只有3种单词并且您对它们全部都进行了索引,则您将拥有与普通页面相同数量的索引页面。
如果一个值的记录相对较少,则性能会有所提高。例如,如果您有1000条记录,其中10条为TRUE,那么如果使用isok = 1
正如迈克尔·杜兰特(Michael Durrant)所说,这也会使写入速度变慢。
编辑:可能的重复:索引布尔字段
在这里,它说明即使有索引,但如果有太多记录,它也不会使用索引。 MySQL在检查= 1时不使用索引,而在= 0时使用
只是为了在这里给出其他几个答案更好的一点,因为根据我的经验,那些正在考虑类似问题的人和我们一样,我们都听说索引布尔字段是没有意义的,但是...
我们有一个表,该表包含约400万行,一次只能标记约1000个左右的布尔开关,这就是我们要搜索的内容。在我们的布尔字段上添加索引可以使查询加速几个数量级,它的时间从大约9+秒缩短到了几分之一秒。
WHERE my_col > 0
而不是my_col = 1
似乎也有助于提高速度
它取决于实际查询和索引/查询组合的选择性。
案例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)
会更好。
这取决于数据的分布。
想象一下,我有一本书,其中有1000个紧密键入的页面,而书中唯一的单词是“ yes”和“ no”,一遍又一遍地重复并随机分布。如果要求我圈出“是”的所有实例,书后的索引是否有帮助?这取决于。
如果存在是和否的一半随机分布,那么在索引中查找将无济于事。索引会使书变大得多,无论如何,我会更快地从头开始,并逐步浏览每一页以查找所有“是”实例并圈出它们,而不是查找其中的每个项目。索引,然后将引用从索引条目中获取到它所引用的页面。
但是,如果说在我的一千页的书中只有十个“是”的实例,而其他所有内容仅仅是数百万个“不是”,那么索引将为我节省寻找十个“是”的实例并将其圈出的时间。
在数据库中也是一样。如果是50:50的分布,则索引将无济于事-数据库引擎最好只是从头到尾遍历数据(全表扫描),而索引只会使数据库更大,并且编写和更新速度较慢。但是,如果它类似于4000:1分配(按照该线程中的oucil的关系),则索引查找可以极大地加快它的速度,如果它是您要查找的4000个项目中的1个。
实际上,这取决于您运行的查询。但是,通常是,以及索引任何其他类型的字段。
是的,索引会提高性能,请检查有无索引的EXPLAIN的输出。
从文档:
索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行。桌子越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。
我认为也可以肯定地说,在这种情况下,索引不会降低性能,因此您只需从中受益。
TINYINT(1) UNSIGNED
列,数据的大小将很小。