代码之家  ›  专栏  ›  技术社区  ›  Bernard Chen

使用char索引查找数值

  •  1
  • Bernard Chen  · 技术社区  · 15 年前

    我在mysql表中有一列,它主要存储数值,但有时存储字符串。它被定义为VARCHAR(20)。此列上有前四个字符的索引。

    ADD INDEX `refNumber` USING BTREE(`refNumber`(4));
    

    由于该字段主要是数字字段,因此用户能够查询数值范围内的值(例如,100到2000)非常有用。如果使用数字比较,则不使用此索引。

    WHERE refNumber BETWEEN 100 AND 2000
    

    如果我使用字符串比较,我会得到一些我不想要的值(例如,当查询100到2000的范围时,返回10000)。

    WHERE refNumber BETWEEN '100' AND '2000'
    

    有好的解决办法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jim Garrison    15 年前

    三种可能性

    1) 将数值分隔到各自的列中。

    2) 如果你必须保持原样,决定数字的最大长度,将数字归零或空白填充到该长度。

    3) 我不知道MySQL是否支持基于函数的索引,但这可能是一种选择。如果是这样,请编写一个函数,返回提取的数值,并将其用作索引的基础。

        2
  •  -1
  •   danielkza    15 年前

    您可以先尝试使用字符串比较,这样就可以使用索引,然后仍然进行数字比较。它不应该太慢,因为第二个过滤器将只应用于一小部分行。

    WHERE refNumber BEETWEEN '100' AND '2000' AND CAST(refNumber as SIGNED INTEGER) BEETWEEN 100 AND 2000