所以我有一个MYSQL数据库,其中布尔值存储为binary(1)
。我要研究为什么某些查询很慢,即使相关列上有索引。问题在于,在构建SELECT查询时,系统使用setBoolean
PreparedStatement
方法,据我所知,该方法将值转换为MYSQL TINYINT
。查询找到了正确的行,但从未使用过索引,因为索引位于二进制列上。但是,如果我使用setString
方法并将布尔值转换为字符串,即'0'
的{{1}}和false
的{{1}},则MYSQL能够使用索引并快速找到想要的行。
基本上,第一个查询是我在使用'1'
时获得的,第二个是使用true
时的查询:
setBoolean
在Java中,改变是这样的:
setString
我的问题是,如果有一种更好的方法吗?一切正常,但出于某种原因,我认为代码“闻起来”,但我无法真正激发原因。
答案 0 :(得分:0)
由于抽象,我更喜欢setBoolean。
真正有趣的一点是你的数据库使用索引。
如果有意义,数据库的优化程序仅使用索引。如果你有1000个条目并且booleanvalue只将它拆分为50/50,那么对于那个索引没有任何意义,特别是当它不是PK时 - 但如果你使用额外的限制,只得到10行,结果是一个好的优化器应该使用你指定的索引 - 可能是2列上的“组合索引”(booleanColumn1,StringColumn1)
答案 1 :(得分:0)
MySQL使用TINYINT(1)作为SQL BOOL / BOOLEAN。所以我会根据标准SQL将数据类型更改为BOOLEAN。
通过您的接力,问题应该得到解决。顺便说一句BIT(1)将是另一种选择。