MySQL: преобразование из MyISAM в InnoDB делает запросы быстрее ...? - PullRequest
0 голосов
/ 12 марта 2012

У меня была таблица с 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;

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Я нашел хорошую статью о InnoDB против MyISAM , в которой говорится о производительности:

Этот метод кластеризованных первичных ключей является одной из причин довольно большой разницы в тестахмежду MyISAM и InnoDB, когда рассматриваемый запрос использует первичный ключ для диапазона. Что несколько удивительно, так это то, что InnoDB по-прежнему побеждает в тестах, использующих вторичный индекс. Это утешительно, так как показывает, что производительность движка основана не только на кластеризации ключей, то есть на повышении производительности.это очень зависит от запроса.

InnoDB также использует некоторые другие приемы с индексами. Он может создавать «адаптивные хеш-индексы» для частых запросов и делает это, когда вся таблица приближается к размеру в памяти. [5]Эти хэш-индексы немного быстрее стандартного индекса BTree (когда таблица находится в памяти). Опять же, это еще одно значительное улучшение производительности за счет использования памяти.

Ваштаблица кажется довольно большой, поэтому я сомневаюсь, что она хранится полностью в памяти, но похоже, что InnoDB обрабатывает индексы лучше, чем MyISAM, в любом случае, к тому же, поскольку вы так конкретны, возможно, кешируется результат запроса.

2 голосов
/ 12 марта 2012

Проверьте конфигурацию двух двигателей.Возможно, что конфигурация вашего механизма InnoDB более эффективна для ваших поисков, чем способ, которым вы настроили MyISAM.

Ключевыми значениями конфигурации является innodb_buffer_pool_size, где InnoDB кэширует данные (и индексирует, но вынет никаких индексов).

...