【问题标题】:How expensive is it to do a query comparing two columns, vs a query on one column?比较两列的查询与对一列的查询的成本是多少?
【发布时间】:2020-07-21 14:48:41
【问题描述】:

我有一个照片数据库。我已经记录了宽度和高度。我正在考虑添加一个“方向”列,以防有人想按纵向或横向过滤。

-- get landscape orientation photos with one column
select * from photos where orientation = 'landscape';

当然,我可以像这样比较两列,不需要方向列:

-- get landscape orientation photos by comparing two columns
select * from photos where width > height;

如果我不是绝对必须创建一个额外的列,我倾向于不这样做。只需要维护一件事。但是不知道是不是在重载下,对比的成本会不会高很多?

【问题讨论】:

  • orientation = 'landscape' 这样带有方向索引的直接比较将比算术比较快得多。如果您将orientation 设为bit(例如,1 = 纵向,0 = 横向),它将几乎不占用空间,并且在插入或更新时很容易计算。
  • 谢谢尼克,也许值得设置。
  • 取决于你有多少张照片?百万 ?如果您不想添加 addl 列,比较不会增加负载
  • @Nick 布尔字段上的索引几乎没用。假设这些值大致均匀地分布在 0 和 1 之间,那么表扫描将比索引查找更快。一般来说,使用索引需要使所需记录低于表总数的 10% 才值得。
  • @JonathanWillcock 同意,如果它们分布大致均匀的话。但是,一般中,照片往往比肖像更倾向于横向。快速扫描我的一张照片磁盘显示在纵向模式下大约 14-15%。

标签: mysql sql database postgresql


【解决方案1】:

你甚至可以让这个计算自动进行:

ALTER TABLE photo ADD COLUMN orientation enum('landscape', 'portrait') GENERATED ALWAYS AS (if(height>width, 'landscape', 'portrait')),
ADD INDEX o(orientation)

如果有其他排序标准或数据集在方式或其他方式上特别有偏差,您可能会有一些效率。通常二进制索引很少能有效地使用,除非所有结果都在该索引中作为主键或复合键。

还有方形照片?

fiddle

【讨论】:

    【解决方案2】:

    了解的方法是在您的特定数据集、数据库(postgresql 和 mysql 完全不同)和版本以及硬件上对其进行基准测试。

    在我的手中,一个字符串列与一个字符串常量的比较比两个浮点列的比较慢得多。

    这种差异不太可能有意义,而且这也不太可能是您正在运行的查询(您真的要从一个大型数据集中返回每张风景照片而无需额外的选择标准吗?)

    【讨论】:

    • 不,我的例子被简化了。肯定会有其他标准。您对如何开始进行基准测试有什么建议吗?
    • 你已经有数据了吗?如果是这样,只需启用 track_io_timing 并使用 EXPLAIN (ANALYZE, BUFFERS) 运行查询。如果查询是参数化的,您应该编写一个包含随机但实际参数的脚本,以便正确测量缓存效果。我还将使用您将使用的任何编程语言在其“自然设置”中运行查询,因为那应该是您最擅长的语言,而且您的驱动程序/语言可能会影响结果是合理的。跨度>
    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多