полезен ли mysql-индекс для столбца 'state', когда он выполняет только битовые операции над столбцом?

0

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

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

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

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

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

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

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

ТИА, Герт-январь

Теги:
bit-manipulation
bitwise-operators

2 ответа

0
Лучший ответ

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

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

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

  • 0
    к сожалению, предопределенный порядок не так, например: в зависимости от результата программы, скажем, может быть установлен бит 7 или 8 и т. д. Я рассмотрю редизайн.
0

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

  • 0
    да, есть некоторая разница, но не совсем то, на что я надеялся .. У меня уже был индекс на месте, он просто не предназначен для того, что я хочу сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню