Mysql, использование индекса для выбора с операторами>, <улучшить производительность? - PullRequest
1 голос
/ 01 октября 2010

Мне нужно выбрать строку из таблицы, которая содержит более 5 миллионов строк.Это таблица всех диапазонов IP.В каждой строке есть столбцы upperbound и lowerbound.Все они являются целыми числами, а число является целочисленным представлением IP-адреса.

Выбор:

select * 
  from iptocity 
 where lowerbound < 3529167967 
   and upperbound >= 3529167967 
 limit 1;

Моя проблема

..., что выбор занимает слишкоммного времени.Без индекса для таблицы InnoDB это занимает 20 секунд.Если это на MyISAM, то это занимает 6 секунд.Мне нужно, чтобы оно было менее 0,1 сек.И мне нужно иметь возможность обрабатывать сотни таких выборок в секунду.

Я пытался создать индекс для InnoDB, как для столбцов верхний и нижний столбцы.Но это не помогло, потребовалось еще больше времени, например, 40 секунд, чтобы выбрать IP.Что случилось?Почему индекс не помог?Работает ли индекс только с оператором =, а операторы>, <не могут использовать индексы?Что мне нужно сделать, чтобы ускорить выбор менее 0,1 секунды? </p>

1 Ответ

2 голосов
/ 01 октября 2010

Вы создали один индекс для обоих столбцов или два индекса по одному столбцу каждый? Если только один индекс, то это может быть вашей проблемой, сделайте один индекс для каждого. Индексы все еще должны работать для < и >

Помимо изменения индексов, выполните:

EXPLAIN
select *
from iptocity
where lowerbound<3529167967
  and upperbound>=3529167967
limit 1;

Тот же запрос, что и у вас, только что добавили EXPLAIN и несколько разрывов строк для удобства чтения.

Ключевое слово EXPLAIN заставит MySQL объяснить вам, как он выполняет запрос, и сообщит вам, используются ли индексы или нет. Для любого медленно выполняющегося запроса всегда используйте explain, чтобы попытаться выяснить, что происходит.

...