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

Java 在PreparedStarement中设置布尔值的最佳实践,java,mysql,Java,Mysql,所以我有一个MYSQL数据库,其中布尔值存储为binary(1)。我要调查的是,为什么即使相关列上有索引,某些查询仍然很慢。问题是,在构建SELECT查询时,系统使用了PreparedStatement的setBoolean方法,据我所知,该方法将值转换为MYSQLTINYINT。查询找到了正确的行,但从未使用索引,因为索引位于二进制列上。但是,如果我改为使用setString方法并将布尔值转换为字符串,即false的'0'和true的'1',MYSQL能够使用索引并快速找到所需的行 基本上,第

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

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

SELECT someColumn FROM table WHERE binaryColumn = 1 //Does not use index
SELECT someColumn FROM table WHERE binaryColumn = '1'//Uses index
在Java中,变化如下:

PreparedStatement ps1 = ...
ps1.setBoolean(1, true);
...

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

我的问题很简单,是否有更好的方法来做到这一点?一切都很好,但出于某种原因,我认为代码“有味道”,但我无法真正激发原因。

由于抽象,我更喜欢setBoolean

真正有趣的一点是数据库使用索引时

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

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


通过您的中继,问题应该得到解决。顺便说一下,位(1)将是另一个选项。

我认为
二进制(n)
数据类型映射到java/JDBC中的
字节[]
。当使用字符串时,驱动程序能够隐式地将其转换为字节[],并使用索引。传递布尔值时无法执行此操作。
binary
是用于布尔值列的错误类型。
binary
列的目的是存储二进制数据,比如一个小图像,可能是一个加密密钥——你知道,小字节块。你可能想要一个
TINYINT
boolean
列(同样的事情),我没有设计数据库,所以这就是我必须使用的@Ianmclaird没关系,我的意思是,您认为代码“有味道”的原因是因为底层数据库设计的缺陷。如果你不能改变数据库的设计,那么你实际上或多或少会被你所拥有的解决方案或者类似的东西所困扰。是的,我知道这一点。在特定的表中,分布在99.9%到0.01%之间,因此一旦使用该索引,它确实有很大帮助。