Использование char index для поиска числовых значений - PullRequest
1 голос
/ 18 ноября 2009

У меня есть столбец в таблице MySQL, который хранит в основном числовые значения, но иногда строки. Он определяется как VARCHAR (20). В этом столбце есть индекс для первых четырех символов.

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

Поскольку поле в основном числовое, для пользователя полезно иметь возможность запрашивать значения, попадающие в числовой диапазон (например, от 100 до 2000). Если я использую числовое сравнение, этот индекс не используется.

WHERE refNumber BETWEEN 100 AND 2000

Если я использую сравнение строк, я получаю некоторые значения, которые мне не нужны (например, 10000 возвращается при запросе в диапазоне от 100 до 2000).

WHERE refNumber BETWEEN '100' AND '2000'

Есть ли хорошее решение для этого?

Примечание. Некоторые значения записываются с нулями на передней панели, например 0234, и должны возвращаться при поиске значений от 100 до 2000.

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

Три возможности

1) Разделите числовые значения в своем собственном столбце.

2) Если вы ДОЛЖНЫ оставить все как есть, определите максимальную длину для чисел, с нулевой или пустой нумерацией чисел до этой длины.

3) Я не знаю, поддерживает ли MySQL индексы на основе функций, но это может быть вариантом. если это так, напишите функцию, которая возвращает извлеченное числовое значение, и используйте его в качестве основы для индекса.

0 голосов
/ 18 ноября 2009

Вы можете сначала попытаться использовать сравнение строк, чтобы использовался индекс, а затем выполнить числовое сравнение. Это не должно слишком сильно тормозить, поскольку второй фильтр будет применяться только к небольшому подмножеству строк.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...