基于布尔值的SQL(mySQL)优化
我正在从事一项相当艰巨的附带项目;我的问题涉及使用布尔值确定是否需要进一步的数据处理时所获得的效率 例如:如果我有一张列出所有生物的表格。在另一张本质上是相关的表格中,列出了它们的冬眠期和冬眠期间每天消耗的卡路里 在(生物)表中有一个“hibernates”布尔值是否有效 如果为true,则转到“休眠\生物\信息\关系”表,找到具有该ID的生物并返回该信息 这意味着,对于“Hibernate”值为false的所有生物,SQL将不必在“hibernation\u bioter\u info\u relations”的大表中进行搜索 或者当使用ID时,检查“hibernation\u Bioter\u info\u relations”表的过程是否如此之快,以至于如果hibernation的值设置为true或false,则必须处理基于什么的参数,这实际上会对性能产生更大的影响基于布尔值的SQL(mySQL)优化,mysql,sql,optimization,Mysql,Sql,Optimization,我正在从事一项相当艰巨的附带项目;我的问题涉及使用布尔值确定是否需要进一步的数据处理时所获得的效率 例如:如果我有一张列出所有生物的表格。在另一张本质上是相关的表格中,列出了它们的冬眠期和冬眠期间每天消耗的卡路里 在(生物)表中有一个“hibernates”布尔值是否有效 如果为true,则转到“休眠\生物\信息\关系”表,找到具有该ID的生物并返回该信息 这意味着,对于“Hibernate”值为false的所有生物,SQL将不必在“hibernation\u bioter\u info\u r
我希望这些信息足以帮助您理解我的问题,如果没有,请让我知道,以便我可以重新措辞或包含更多细节。不,这不是一个好的方法 使用可以为
null
的正常字段
范例
table creatures
---------------
id name info_id
1 dino null
2 dog 1
3 cat 2
table info
--------------
id info_text
1 dogs bark
2 cats miauw
现在,您只需执行连接:
SELECT c.name, i.info_text
FROM creature c
LEFT JOIN info i ON (c.info_id = i.id)
如果您这样做,SQL可以使用索引。SQL数据库不会在布尔字段上创建索引。
该字段的基数太低,在低基数字段上使用索引会减慢速度,而不是加快速度
请参阅:如果只想使用列“hibernates”来防止SQL必须搜索其他表,则应遵循@Johan,否则可以在列“hibernates”上创建索引,这将缩短执行时间。但请记住@Johan想告诉您的内容。必须在另一个表中复制hibernate字段,您不会获得太多收益。减少数据集大小所带来的任何速度收益都将被首先必须连接回原始表所抵消。此外,请记住,与命令式语言不同,您(通常)对SQL中的执行顺序/优化几乎没有控制权。这是优化器的工作,它可以做很多事情来“尝试”加速查询,包括重新排序联接、使用表扫描、切换标记、选择不同的排序以及创建临时表。也没有短路逻辑这样的东西,特别是在连接的上下文中(优化器可以随意随意处理它们)。@nathangonzalez也许他们会,谁能确定呢?+1表示拟声动物的声音不是我的母语@Ealianis,请参阅文章中的链接。使用索引需要时间,因为MySQL必须从单独的文件中读取索引数据。除非索引在其他地方节省了大量时间,否则它会减慢速度。如果选择了所有行的20%以上,则不使用索引会更快。我在看到链接时删除了该评论,感谢您的回复,尽管这很有帮助!所以,如果超过20%的动物冬眠,使用索引是不明智的?或者,如果20%的动物被选中并返回,这是不明智的?