使用char索引查找数值

时间:2009-11-17 21:08:43

标签: mysql select indexing

我在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之间的值时应该返回。

2 个答案:

答案 0 :(得分:1)

三种可能性

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

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

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

答案 1 :(得分:-1)

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

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