【问题标题】:INT vs VARCHAR in searchINT 与 VARCHAR 在搜索中
【发布时间】:2011-06-04 05:08:42
【问题描述】:

以下哪个查询会更快、更优化(以及为什么):

  1. SELECT * FROM items WHERE w = 320 AND h = 200(w 和 h 为 INT)

  2. SELECT * FROM items WHERE dimensions = '320x200'(维度为 VARCHAR)

【问题讨论】:

  • 我要指出的是,这两列也可能包含更准确的数据,这对于良好的数据库设计至关重要。
  • 如果您声明将高度和宽度作为两个单独的 varchar 进行比较,那将是一个更好的比较。你让每个人都回答如果这个,如果那个......

标签: sql mysql database database-design search


【解决方案1】:

以下是一些实际测量值。 (使用 SQLite;以后可能会尝试使用 MySQL。)

数据 = w, h ∈ {1...1000} 的所有 1,000,000 个组合,按随机顺序排列。

CREATE TABLE items (id INTEGER PRIMARY KEY, w INTEGER, h INTEGER)

执行SELECT * FROM items WHERE w = 320 and h = 200 的平均时间(20 次运行)为 5.39±0.29 µs。

CREATE TABLE items (id INTEGER PRIMARY KEY, dimensions TEXT)

执行SELECT * FROM items WHERE dimensions = '320x200' 的平均时间为 5.69±0.23 µs。

在效率方面没有显着差异。

但是

在可用性方面存在巨大差异。例如,如果要计算矩形的面积和周长,两列的方法很简单:

SELECT w * h, 2 * (w + h) FROM items

尝试用另一种方式编写相应的查询。

【讨论】:

    【解决方案2】:

    直观地说,如果您不在这些列上创建INDEXes,整数比较似乎更快。

    在整数比较中,您使用逻辑运算符直接比较 32 位值的相等性。

    另一方面,字符串是字符数组,很难比较它们。逐个字符。

    但是,另一点是,在第二个查询中,您有 1 个要比较的字段,在第一个查询中,您有 2 个字段。如果您有 1,000,000 条记录并且列上没有索引,这意味着在最坏的情况下您可能有 1,000,000 次字符串比较(不幸的是,最后一个结果是您正在寻找或根本找不到的东西)

    另一方面,您有 1,000,000 条记录并且都是 w=320,那么您也将比较它们的 h。这意味着 2,000,000 次比较。但是,您在这些字段上创建 INDEX 恕我直言,它们几乎是相同的,因为 VARCHAR 将被散列(占用 O(1) 恒定时间)并将使用 INT 比较进行比较并占用 O(logn) 时间。

    结论,这取决于。首选可搜索列上的索引并使用整数。

    【讨论】:

      【解决方案3】:

      可能知道这一点的唯一方法就是运行它。我怀疑如果使用的所有列都被索引,则基本上没有区别。如果 INT 是 4 个字节,它将与字符串的大小几乎相同。

      唯一的问题在于 VARCHAR 的存储方式。如果您使用恒定的字符串大小,它可能比 VARCHAR 更快,但主要是因为您的 select * 需要去获取它。

      使用 INT 的巨大优势是您可以进行更复杂的过滤。仅此一项就应该是喜欢它的理由。如果你需要一个范围,或者只是宽度,或者你想在过滤中对宽度进行数学运算怎么办?基于列或聚合的约束呢?

      此外,当您将值导入编程语言时,您无需在使用它们之前对其进行解析(这需要时间)。

      编辑:其他一些答案提到了字符串比较。如果被索引,将不会进行很多字符串比较。并且可以实现不需要逐字节循环的非常快速的比较算法。您必须知道 mysql 的详细信息才能确定。

      【讨论】:

        【解决方案4】:

        第二次查询,因为匹配确切字符串的机会更小(这意味着更小的记录集但具有更大的基数)

        第一次查询,匹配第一列的机会更高,可能匹配的行更多(基数更小)

        当然,假设为两种情况都定义了索引

        【讨论】:

        • 这不是通过搜索较小的数据集来抵消吗,因为第一个查询将首先只找到第一个字段匹配的行,然后在该记录集中搜索第二个字段中的匹配项?
        • @JNK - 解释了较少的记录但较大的基数,比较两列只是更多的记录,每列的基数较小
        【解决方案5】:

        第一个是因为比较数值数据更快。

        【讨论】:

          【解决方案6】:

          这取决于数据和可用索引。但是 VARCHAR 版本很可能更快,因为搜索单个索引可以比两个更快。如果值的组合提供了唯一(或“大部分”唯一)结果,而每个单独的 H/W 值都有多个条目,那么它可以使用单个索引将范围缩小到更小的集合。

          另一方面,如果您在 to 整数列上有一个多列索引,那可能是最有效的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-02
            • 1970-01-01
            • 2012-01-20
            • 2011-01-21
            • 2013-12-31
            • 1970-01-01
            相关资源
            最近更新 更多