У меня была таблица с 3 000 000 строк, в которой указаны диапазоны IP-адресов и соответствующие им страна, регион (провинция) и город. Таблица была в движке MyISAM.
Я написал скрипт для выборки географического местоположения пользователей по их IP, и некоторые запросы занимали до 17 секунд. Затем я преобразовал таблицу в InnoDB и повторил процесс запросов, некоторые из проблемных запросов, о которых известно, что они занимали много времени, прежде чем значительно улучшились в производительности, заняли всего 0,02 секунды. Несмотря на то, что запросы по-прежнему обрабатывались в течение 2 или 3 секунд, все время, затрачиваемое на поиск около 1000 IP-адресов, занимало примерно вдвое меньше времени, чем при запуске на движке MyISAM.
Я выполнил поиск в Интернете, сравнивая MyISAM и InnoDB, но все прочитанные статьи оценивали MyISAM быстрее, чем InnoDB по запросам SELECT. Однако, согласно тому, что я видел, это не относится к моей таблице. У кого-нибудь есть теории, почему?
P.S. В моей таблице нет ограничений FK, нет PK, поиск выполняется путем сравнения IP-адресов со столбцами 'ip_start' и 'ip_end' каждой строки. Строка будет соответствовать, если IP находится в пределах диапазона. Ниже приведен пример запроса в моем скрипте:
SELECT country, region, city FROM ip_location WHERE ip_start<=1177798832 AND ip_end>=1177798832 LIMIT 1;