Индекс MySQL и битовые операции

Рейтинг: 2Ответов: 2Опубликовано: 08.10.2014

Здравствуйте! Возник вопрос. Есть у меня в таблице размером около 15 000 записей поле mask, по которому всегда будет осуществляться выборка. Это поле является индексом тип tinyint.

Насколько я понял, если при выборке использовать битовые операции типа

SELECT * FROM tablename WHERE mask & 1

то индекс не используется. А т.к. это каталог товаров, то обращаться к БД будут часто, поэтому критично время выполнения запроса.

Как можно заставить mysql использовать этот индекс?

Ответы

▲ 2

Два варианта, и оба не совсем то, что вы хотите, так как MySql на данный момент не умеет так индексировать.

  1. Вместо tinyint создать 8 (или сколько там?) различных колонок. mask_1... etc. Сравнивать с ними. Можно это делать в отдельной таблице при добавлении записи в основную: разбивать маску на отдельные биты.

  2. Заранее готовить массив для операции where mask in (...).
    Как вариант, можно оптимизировать, создавая where in для второй половины и where NOT in для первой.

В общем, все это костыли. Придумайте, как совершить эту же операцию где-то еще.

▲ 2

Есть вариант использовать клонку типа set. Запрос SELECT * FROM tablename WHERE mask & 1 по такому полю сможет использовать индекс.