在Prepared Statement中设置布尔值时的最佳做法

时间:2013-12-16 12:34:11

标签: java mysql

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

基本上,第一个查询是我在使用'1'时获得的,第二个是使用true时的查询:

setBoolean

在Java中,改变是这样的:

setString

我的问题是,如果有一种更好的方法吗?一切正常,但出于某种原因,我认为代码“闻起来”,但我无法真正激发原因。

2 个答案:

答案 0 :(得分:0)

由于抽象,我更喜欢setBoolean。

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

如果有意义,数据库的优化程序仅使用索引。如果你有1000个条目并且booleanvalue只将它拆分为50/50,那么对于那个索引没有任何意义,特别是当它不是PK时 - 但如果你使用额外的限制,只得到10行,结果是一个好的优化器应该使用你指定的索引 - 可能是2列上的“组合索引”(booleanColumn1,StringColumn1)

答案 1 :(得分:0)

MySQL使用TINYINT(1)作为SQL BOOL / BOOLEAN。所以我会根据标准SQL将数据类型更改为BOOLEAN。

通过您的接力,问题应该得到解决。顺便说一句BIT(1)将是另一种选择。