полезен ли индекс mysql для столбца «состояние», когда выполняются только битовые операции в столбце?

У меня есть много доменных объектов (хранящихся в mysql), которые выполняют множество различных операций. Каждая операция выполняется из отдельной программы. Мне нужно сохранить состояние (потока) для этих сущностей, которые я реализовал в виде длинного поля 'flowstate', используемого в качестве набора битов.

чтобы запросить mysql для объектов, которые подверглись определенной операции, я делаю что-то вроде:

select * from entities where state >> 7 & 1 = 1

Индикация бита 7 (соответствующего операции 7) выполнена. (‹-- упрощенно)

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

Что я хотел бы знать: помогает ли вообще индекс mysql для «flowstate»? В конце концов, это не единственное значение, которое Mysql может быстро найти, используя двоичную сортировку или что-то еще.

Если это не так, могу ли я сделать что-то еще, чтобы ускорить процесс? . Существуют ли специальные «индексы маски» для полей с вариантами использования, как указано выше?

ТИА, Герт-джан


person Geert-Jan    schedule 10.06.2010    source источник


Ответы (2)


Я не думаю, что в этом случае MySQL может использовать индекс. Если бы вы знали, что биты всегда устанавливаются слева направо, справа налево или в каком-то определенном порядке, вы могли бы проделать некоторые трюки, ограничивая количество строк, которые необходимо проверить:

... where state < ? and state > ? and ...

Если бы это было так, то индекс состояния был бы полезен. Хотя, наверное, это далеко. В противном случае лучше всего, вероятно, пересмотреть вашу схему.

person nathan    schedule 11.06.2010
comment
к сожалению, предопределенный порядок не имеет места, например: в зависимости от результата программы, скажем, может быть установлен бит 7 или 8 и т. д. Я рассмотрю возможность перепроектирования. - person Geert-Jan; 11.06.2010

Используйте EXPLAIN в операторе, чтобы увидеть, как он обращается к таблице. Стоит поместить индекс в поле и повторно запустить EXPLAIN, чтобы увидеть, использует ли его MySQL. Между результатами должна быть очевидная разница в производительности, если таблица достаточно большая.

person Nick    schedule 11.06.2010
comment
да, есть некоторая разница, но не совсем то, на что я надеялся. У меня уже был индекс, просто он не предназначен для того, что я хочу делать. - person Geert-Jan; 11.06.2010