У меня есть много объектов домена (хранимых в mysql), которые проходят множество разных операций. Каждая операция выполняется из другой программы. Мне нужно сохранить (flow) -state для этих объектов, которые я реализовал как длинное поле "flowstate", используемое в качестве битового набора.
для запроса mysql для объектов, которые подверглись определенной операции, я делаю что-то вроде:
select * from entities where state >> 7 & 1 = 1
Индикатор бит 7 (сопутствующий операции 7) запустился. (< - упрощенный)
Во всяком случае, я действительно не обращал внимания на последствия этой установки в начале, и я думаю, что у меня проблемы с запросами, так как предыдущие выполняются довольно медленно.
Что я хотел бы знать: Помогает ли индекс mysql в 'flowstate' вообще? В конце концов, это не одно значение, которое Mysql может быстро найти, используя двоичную сортировку или что-то еще.
Если это не так, есть ли какие-то другие вещи, которые я мог бы сделать, чтобы ускорить процесс?, Существуют ли специальные "маски-индексы" для полей с прецедентами, как указано выше?
ТИА, Герт-январь
Я не думаю, что MySQL мог бы использовать индекс в этом случае. Если вы знали, что биты всегда устанавливаются слева направо или справа налево или в определенном порядке, вы можете сделать некоторые трюки, в которых вы ограничите количество строк, которые необходимо проверить:
... where state < ? and state > ? and ...
Если бы это было так, то индекс по состоянию был бы полезен. Это, вероятно, длинный выстрел. В противном случае лучше всего пересмотреть свою схему.
Используйте EXPLAIN в инструкции, чтобы узнать, как он обращается к таблице. Стоит поставить индекс на поле и повторно использовать EXPLAIN, чтобы узнать, использует ли MySQL его. Должно быть очевидное различие в производительности между результатами, если таблица довольно большая.