首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PreparedStarement中设置布尔值时的最佳实践

在PreparedStarement中设置布尔值时的最佳实践
EN

Stack Overflow用户
提问于 2013-12-16 12:34:10
回答 2查看 511关注 0票数 1

所以我有一个MYSQL db,其中布尔值存储为binary(1)。我要研究为什么某些查询是缓慢的,即使在相关列上有一个索引。问题是,在构建SELECT查询时,系统使用了setBoolean方法PreparedStatement,据我所知,该方法将值转换为MYSQL TINYINT。查询找到了正确的行,但没有使用索引,因为索引位于二进制列上。但是,如果我使用setString方法并将布尔值转换为字符串,即'0' for false'1' for true,MYSQL就能够使用索引并快速找到想要的行。

基本上,第一个查询是我使用setBoolean时得到的,第二个查询是使用setString时得到的。

代码语言:javascript
运行
复制
SELECT someColumn FROM table WHERE binaryColumn = 1 //Does not use index
SELECT someColumn FROM table WHERE binaryColumn = '1'//Uses index

在Java中,所做的改变是:

代码语言:javascript
运行
复制
PreparedStatement ps1 = ...
ps1.setBoolean(1, true);
...

PreparedStatement ps2 = ...
ps2.setString(1, "1");
...

我的问题是,是否有一种更好的方法来做到这一点?一切都很好,但出于某种原因,我认为代码“闻起来”,但我不能真正激励为什么。

EN

回答 2

Stack Overflow用户

发布于 2013-12-16 13:01:52

由于抽象,我总是喜欢setBoolean。

真正有趣的一点是DB何时使用索引。

数据库的优化者只使用索引(如果有意义的话)。如果有1000个条目,而布尔值仅将其拆分为50/50,则该索引没有意义,特别是当它不是PK时--但如果使用附加限制,只获得10行,那么一个好的优化器应该使用您指定的索引--可能是2列上的“组合索引”(booleanColumn1,StringColumn1)。

票数 0
EN

Stack Overflow用户

发布于 2013-12-16 13:03:31

MySQL使用TINYINT(1)作为SQL /布尔值。因此,我将根据标准SQL将数据类型更改为布尔值。

通过你的接力,这个问题就应该得到解决。顺便说一下,位(1)将是另一种选择。

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

https://stackoverflow.com/questions/20611082

复制
相关文章

相似问题

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