【问题标题】:SQL (mySQL) optimization via BOOLEAN values通过布尔值优化 SQL (mySQL)
【发布时间】:2011-10-25 18:48:35
【问题描述】:

我正在做一个相当艰巨的副项目;我的问题是关于使用 BOOLEAN 值来确定是否需要进一步处理数据时所获得的效率。

例如:如果我有一张列出所有生物的表格。在另一个本质上是相关的表格中列出了它们的冬眠期,以及冬眠期间每天消耗的卡路里。

在 (Creatures) 表中设置“hibernates”布尔值是否有效。

如果为真,则转到“hibernation_creature_info_relations”表并找到具有该 ID 的生物并返回该信息。

这意味着对于 "hibernates" = false 值的所有生物,将阻止 SQL 搜索 "hibernation_creature_info_relations" 的大表。

或者当使用 ID 时,检查“hibernation_creature_info_relations”表的过程如此之快,以至于必须处理基于休眠值是否设置为的参数,实际上会对性能产生更大的影响是真是假?

我希望这些信息足以帮助您理解我的要求,如果没有,请告诉我,以便我重新措辞或提供更多详细信息。

【问题讨论】:

  • 在另一个表中复制 hibernate 字段不会有太多好处。减少数据集大小所带来的任何速度提升都将因必须首先加入原始表而被抵消。
  • 另外,请记住,与命令式语言不同,您(通常)对 SQL 中的执行顺序/优化几乎没有控制权。那是优化器的工作,它可以做各种各样的事情来“尝试”加速查询——包括重新排序连接、使用表扫描、切换索引、选择不同的排序以及创建临时表。也没有真正的短路逻辑之类的东西,尤其是在连接的上下文中(优化器可以随意乱用它们)。

标签: mysql sql optimization


【解决方案1】:

不,这不是做事的好方法。

改用可以是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 数据库会在布尔字段上创建索引。
该字段的基数太低,在低基数字段上使用索引会减慢而不是加快速度。

见:MySQL: low cardinality/selectivity columns = how to index?

【讨论】:

  • @nathangonzalez 也许他们知道,谁能确定?
  • +1 对于不是我的母语的拟声动物声音!
  • @Ealianis,请参阅文章中的链接。使用索引需要时间,因为 MySQL 必须从单独的文件中读取索引数据。除非索引在其他地方节省大量时间,否则它会减慢速度。如果超过 20% 的行被选中,不使用索引会更快。
  • 我在看到链接时删除了评论,感谢您的回复,虽然它有很大帮助!
  • 那么如果超过 20% 的动物冬眠,那么使用索引是不明智的吗?或者如果选择并退回了 20% 的动物,那是不明智的?
【解决方案2】:

如果您想只使用“休眠”列来防止 SQL 必须搜索另一个表,那么您应该 关注@Johan 否则您可以创建“休眠”列上的索引将提高执行时间。 但请记住 @Johan 试图告诉你的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多