所以我有一个MYSQL db,其中布尔值存储为binary(1)。我要研究为什么某些查询是缓慢的,即使在相关列上有一个索引。问题是,在构建SELECT查询时,系统使用了setBoolean方法PreparedStatement,据我所知,该方法将值转换为MYSQL TINYINT。查询找到了正确的行,但没有使用索引,因为索引位于二进制列上。但是,如果我使用setString方法并将布尔值转换为字符串,即'0' for false和'1' for true,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");
...我的问题是,是否有一种更好的方法来做到这一点?一切都很好,但出于某种原因,我认为代码“闻起来”,但我不能真正激励为什么。
发布于 2013-12-16 13:01:52
由于抽象,我总是喜欢setBoolean。
真正有趣的一点是DB何时使用索引。
数据库的优化者只使用索引(如果有意义的话)。如果有1000个条目,而布尔值仅将其拆分为50/50,则该索引没有意义,特别是当它不是PK时--但如果使用附加限制,只获得10行,那么一个好的优化器应该使用您指定的索引--可能是2列上的“组合索引”(booleanColumn1,StringColumn1)。
发布于 2013-12-16 13:03:31
MySQL使用TINYINT(1)作为SQL /布尔值。因此,我将根据标准SQL将数据类型更改为布尔值。
通过你的接力,这个问题就应该得到解决。顺便说一下,位(1)将是另一种选择。
https://stackoverflow.com/questions/20611082
复制相似问题