Определите, является ли поле в индексированном столбце MySql числовым, используя семантику индекса - PullRequest
1 голос
/ 03 апреля 2012

У меня есть таблица MySql, в которой я хочу получить количество строк, в которых данный столбец VARCHAR имеет числовое значение (вы знаете, можно преобразовать в число).Прямо сейчас я делаю простую проверку REGEXP в этом поле.Так как эта таблица очень большая, я использую серию индексов для REGEXP как можно меньшего числа строк.

Но этот столбец VARCHAR также проиндексирован.Есть ли хитрый алгоритм индексации MySql, который я могу использовать для сканирования еще меньшего количества строк?: - / Это таблица InnoDB.

1 Ответ

1 голос
/ 03 апреля 2012

Вам может не понравиться это, поскольку вы, вероятно, уже пытаетесь избежать этого, но вместо того, чтобы пытаться сделать какой-то умный трюк, когда у меня были подобные ситуации, я добавляю дополнительный столбец, который хранит varchar в числовом столбце.(обновляется с использованием триггера), и запрос к нему.

Но есть способ, которым я вижу, как это сделать (хотя у меня никогда не было причин делать это в производстве), который заключается в использованиитот факт, что индексирование упорядочит значения по порядку, так что все, что начинается с числа, упорядочено вместе.

Предполагается, что таблица выглядит следующим образом:

CREATE TABLE `test_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `text_or_number` varchar(255),
  PRIMARY KEY (`id`),
  KEY `test_1_idx` (`text_or_number`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Вы можете выбрать только значения, начинающиеся счисла, используя порядок символов utf8 - http://en.wikipedia.org/wiki/UTF-8#Examples

Наименьшее значение перед 0 в utf-8 - это "/", а наивысшее после него - ":", поэтому следует извлекать только те значения, которые начинаютсяс числом:

select   cast(text_or_number as unsigned)
from     test_1
where    text_or_number < ':'
and      text_or_number > '/'
and      cast(text_or_number as unsigned) > 0;

Это может по-прежнему содержать значения, начинающиеся с цифры, но не заканчивающиеся на единицу, поэтому я добавил условие cast (...)> 0, но ягоink mysql будет достаточно умен, чтобы выполнять предложения where по порядку, поэтому, надеюсь, он будет выполнять приведение только к подмножеству строк, начинающихся с числового символа.

...