Ускорение выбора SQL-запроса из большой таблицы целых чисел - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть таблица numbers, которая выглядит так

id (int) | start (int u) | end (int u)
1          50              100
2          250             396
3          900             1000

В нем около 400 тыс. Строк, и данные в нем никогда не изменяются. Диапазоны не перекрываются.

Я выполняю запрос, подобный этому:

SELECT id FROM numbers WHERE *somenumber* BETWEEN start AND end LIMIT 1

Запрос занимает около 3 с., Чтобы завершить, что является вечностью, поэтому я попытался найти некоторые решения, чтобы сделать его быстрее. Единственное, что я придумал, - это наложение нескольких индексов на начальный и конечный столбцы, но в действительности это сделало его МЕДЛЕННЫМ, тот же самый запрос теперь удивительно занимает 0,9 секунды, чтобы закончить с ИНДЕКСАМИ, присутствующими в двух столбцах.

Итак, как я могу сделать этот запрос быстрее, если это вообще возможно?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Создание мультииндекса для столбца start и столбца end ускорит процесс для вашего варианта использования.

0 голосов
/ 30 апреля 2018

REVISED ...

После переосмысления его можно даже упростить до

Позволяет экстраполировать ваши данные выборки даже при условии, что номера Id не в точном последовательном порядке

id (int) | start (int u) | end (int u)
1          50              100
2          250             396
3          900             1000
4          101             175
5          418             724
6          397             417
7          176             249

Скажем, вы ищете номер 723 (сейчас в записи № 5).

 SELECT N.*
       FROM numbers N 
       WHERE N.start <= 723 
         AND N.End >= 723
         AND N.start < 723

Промежуточный интервал такой же, как и для явных> = и <=, но, добавив, что старт ДОЛЖЕН быть меньше требуемого вами числа, вы исключаете все те, которые выше, из любого рассмотрения. выводит список с самым низким квалификатором. </p>

0 голосов
/ 30 апреля 2018

Сначала попробуйте индекс на numbers(start).

Если это не помогает (а between может что-то мешать), тогда позвольте мне предположить, что диапазоны не перекрываются. Если нет, то попробуйте это:

SELECT id
FROM numbers
WHERE *somenumber* >= start 
ORDER BY start DESC
LIMIT 1;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...