Ваш дизайн стола выключен.
Вы используете десятичную дробь, но не допускаете никаких нулей. Вы немедленно тратите 5 байтов для хранения такого числа, и достаточно простого INT (4 байта).
После этого вы создаете составной первичный ключ (5 + 5 байт), за которым следуют 2 уникальных ограничения (по 5 байт каждое), что делает ваш индексный файл почти того же размера, что и файл данных.
Таким образом, независимо от того, что вы указали, крайне неэффективно.
Использование LIMIT не заставляет MySQL использовать индексы, по крайней мере, не так, как вы построили свой запрос. Что произойдет, так это то, что MySQL получит набор данных, удовлетворяющий условию, а затем отбросит строки, которые не соответствуют смещению-пределу.
Кроме того, использование защищенных ключевых слов MySQL (таких как START и STOP) - плохая идея, вам следует никогда называть столбцы с использованием защищенных ключевых слов.
Что было бы полезно, так это создать первичный ключ таким, какой он есть, и не индексировать столбцы отдельно.
Кроме того, настройка MySQL для использования большего объема памяти ускорит выполнение.
В целях тестирования я создал таблицу, аналогичную вашей, я определил составной ключ start
и stop
и использовал следующий запрос:
SELECT `country` FROM table WHERE 1500 BETWEEN `start` AND `stop` AND start >= 1500
Моя таблица имеет тип InnoDB, у меня вставлено 100 тыс. Строк, запрос проверяет 87 строк таким образом и выполняется за несколько миллисекунд, мой размер пула буферов составляет 90% памяти на моей тестовой машине. Это может дать представление об оптимизации вашего экземпляра query / db.