首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MySQL不对作为布尔值的int字段使用索引?

为什么MySQL不对作为布尔值的int字段使用索引?
EN

Stack Overflow用户
提问于 2008-12-24 15:15:10
回答 4查看 2.8K关注 0票数 4
代码语言:javascript
运行
复制
select * from myTable where myInt

即使在possible_keys字段上有索引,在解释查询时也不会显示任何myInt。

编辑:

所讨论的索引并不是唯一的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-24 15:15:15

要使MySQL使用索引,必须显式地将int字段与值进行比较(例如,true,1)。

代码语言:javascript
运行
复制
select * from myTable where myInt = true
票数 5
EN

Stack Overflow用户

发布于 2008-12-24 15:18:34

我不是数据库专家,但如果字段中只有两个可能的值,那么它不就不能实现在字段上建立索引的目的吗?

如果索引列中的所有字段都是唯一的,那么数据库引擎可以执行索引扫描来查找相关的行。如果只有两个可能的值,那么我看不出将该字段编入索引的目的。DB引擎必须执行与不存在索引时相同的操作。

也许MySQL没有将其显示为可能的键,因为引擎放弃了在执行计划中使用索引的想法?

票数 2
EN

Stack Overflow用户

发布于 2008-12-24 17:12:35

有很多因素需要考虑。

一个不应该进入它的因素是问题中使用的符号。当列是布尔值时,优化器应该将这些条件视为相同的:

代码语言:javascript
运行
复制
SELECT * FROM MyTable WHERE MyInt;

SELECT * FROM MyTable WHERE MyInt != 0;

SELECT * FROM MyTable WHERE MyInt IS TRUE;

SELECT * FROM MyTable WHERE MyInt = TRUE;

可能还有其他类似的提法。其中第一个不是标准的SQL (即使MyInt的类型是布尔的,其他的也是标准的)。但是优化器应该简单地将速记转换成适当的长表单,然后表现得就像长表单是用户编写的一样。(如果优化器没有这样做,那么优化器就会出现问题;在决定如何处理查询之前,应该将查询简化为规范形式。然而,即使是最好的优化器也常常存在盲点。学习如何避免这些是一种艺术形式,而且本质上是特定于DBMS的。)

优化器在认为索引将提高查询性能时使用索引。当索引不能提高性能时,它将被忽略(如果优化器是好的)。有时,这取决于索引的统计数据是否是最新的。

在数据仓库系统中,系统可以被设计和配置为非常快地对表进行顺序扫描;在这样的系统中,如果索引的选择性使使用索引的次数超过行数的25%,那么进行全表扫描实际上比使用索引要快。

想想看。当通过索引读取时,DBMS必须至少进行两次读取;它从索引页读取有关行的信息,然后从数据页读取行。

有些DBMS只提供索引表.所有数据都在索引中。其他DBMS提供了一种机制,您可以说“索引在A、B、C列上是唯一的;但是,在数据中也包括D和E列”。然后,如果查询需要来自A、B、C、D或E(或任何组合)的数据,并且没有对其他列进行筛选,DBMS只需扫描索引,而不需要扫描表页。

通常,一个页面会有许多索引行。但是,对于某些表,读取索引可能需要读取更多的数据,而不是读取行。考虑包含两个(4字节)整数ID值的原型多到多映射表。这需要数据页中的每行8字节,但索引可能需要4-8字节的开销(因为索引键条目存储两个ID值以及在磁盘上定位相应行所需的信息)。因此,即使索引扫描是“仅索引扫描”,也可能需要磁盘I/O是数据扫描的两倍。

这几乎没有触及使用或不使用索引的可能原因的表面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/391637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档