2015-12-06 2 views
2

У меня есть таблица в тузде InnoDB следующим образом:Имеет ли комбинация> = ИЛИ <= запуск полного сканирования таблицы?

messageIdStart | messageIdEnd | blob 
------------------------------------ 
     40    50   ... 
     51    58   ... 
     59    70   ... 

       ... 

Я хочу, чтобы все строки, которые имеют идентификаторов больше, чем определенное значение.

Например, я хочу, чтобы все строки, которые имеют сообщения с идентификаторами больше, чем 55. Я хотел бы сделать:

select * from table 
    where messageIdStart >= 55 or messageIdEnd <= 55; 

Это дало бы мне последние две строки в примерных данных, и это хорошо.

Требуется ли для этого типа запроса полное сканирование таблицы? Будет ли он плохо масштабироваться? На обоих этих столбцах есть индекс.

Если бы я имел одну строку для каждого сообщения, я мог бы просто сделать:

select * from table where messageId >= 55; 

, но это то, что я унаследовал.

Я думаю о попытке переформатировать набор данных во второй формат, но не хочу преждевременно оптимизировать.

Благодаря

+0

«На обоих этих столбцах есть индекс». Означает ли это, что на обоих столбцах есть составной индекс, или есть один индекс на колонки, т. Е. 2 ​​индекса? – Musa

+0

Существует один индекс за столбец (не составной индекс). Я мог бы создать составной индекс. – user3203425

+0

Если это так, тогда ваш запрос не будет использовать сканирование таблицы, вы также можете проверить с помощью команды объяснения. http://dev.mysql.com/doc/refman/5.7/ru/explain.html – Musa

ответ

1

Запрос у вас есть, скорее всего, смотреть на индекс, который у вас уже есть. Вы должны подтвердить, что это так, используя EXPLAIN и EXPLAIN EXTENDED.

explain select * from table 
where messageIdStart >= 55 or messageIdEnd <= 55; 

Если вы видите, что запрос приводит к выбору вашего индекса, вы не выполняете сканирование таблицы. Я предполагаю, что MySQL будет использовать индекс.

У вас также есть возможность обеспечить hints to the query как так:

select * from table use index (idx_table_messageIdStart) 
where messageIdStart >= 55 or messageIdEnd <= 55; 

На маленьком столике, двигатель базы данных может распознавать соответствующие индексы и все еще может сделать сканирование таблицы, если он считает, что сканирование таблицы будет быстрее (Example)

0

Это будет зависеть от атрибута, на котором вы выполняете операцию '> =' или '< ='. Если для этого атрибута есть tree based index, то сканирование всей таблицы не требуется. Вы можете просто обрезать поддеревья, которые выпадают из диапазона.

Если есть какой-либо другой тип индекса или нет индекса для этого атрибута, вам необходимо выполнить полное сканирование таблицы.

Смежные вопросы