【问题标题】:Using char index to find numeric values使用 char 索引查找数值
【发布时间】:2009-11-17 21:08:42
【问题描述】:

我在 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'

有什么好的解决办法吗?

注意:有些值是记录在前面补零的,比如 0234,在查找 100 到 2000 之间的值时应该返回。

【问题讨论】:

    标签: mysql select indexing


    【解决方案1】:

    三种可能

    1) 将数值分隔到它们自己的列中。

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

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

    【讨论】:

    • 我怀疑填充或分隔数值可能是我面临的选项。我等着看有没有其他的建议。
    【解决方案2】:

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

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

    【讨论】:

    • cast() 对 MySQL 中的非数字值有什么作用?
    • 这是一个有趣的建议。我认为 CAST 不适用于非数值,并且在将 BETWEEN 运算符与数值一起使用时最终会丢弃这些行。不过,我确实收到了一些关于数字非整数值的警告。对于我的特殊情况,我发现我有一些像 0234 这样的值,它与字符串的第一个“BETWEEN”子句不匹配。我将编辑原始问题以表明已填充了一些值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多