Назад | Перейти на главную страницу

Быстрый запрос большого набора данных: MySQL MEMORY (HEAP), MyISAM или что-то еще (например, MemCached)

В настоящее время работает над проектом, который основан на медицинском словаре, известном как SNOMED. В основе snomed лежит (реляционный) набор данных длиной 350 000 терминов / записей. Мы хотим иметь возможность быстро запрашивать в этом наборе данных часть ввода данных, где мы хотели бы иметь некоторую форму или форму автозаполнения / предложения.

В настоящее время он находится в MySQL MyISAM DB только для целей разработки, но мы хотим начать играть с некоторыми параметрами в памяти. В настоящее время это 30 МБ, включая индексы. MEMORY MySQL Engine и MemCached были очевидными, поэтому мой вопрос: какой из них вы бы предложили или есть что-то получше? Мы работаем с Python в первую очередь на уровне приложений, если это имеет значение.

Боковое примечание: набор данных имеет отдельную связь, которая сопоставляет эти концепции с общими именами псевдонимов и сокращениями, что составляет около 1,3 миллиона записей ... в конечном итоге мы захотим использовать и его подмножество здесь.

Не совсем ясно, каковы ваши требования, но с такой небольшой базой данных запросы, вероятно, будут быстрыми на любом движке, поскольку все данные уместятся в памяти.

Такие вещи, как MyISAM и InnoDB, требуют некоторой настройки для работы. Memcached полезен только в том случае, если вам нужно масштабироваться до очень высоконагруженных рабочих нагрузок на основе чтения, то есть тех, которые слишком высоки для одного сервера, чтобы обслуживать его из обычной базы данных в памяти (основная функция Memcached - это возможность масштабирования по пулу серверов). Но memcached не может выполнять обычные запросы, такие как сканирование диапазона, только поиск по определенному ключу, поэтому это не универсальная база данных.

Я бы рекомендовал использовать innodb с пулом буферов, превышающим ваш набор данных, и правильно выбирать первичные ключи. Сканирование диапазона первичных ключей должно работать очень хорошо и его можно использовать для сопоставления префиксов (например, варианты использования завершения).

Вы сможете масштабироваться, скажем, до 1000 запросов в секунду на обычном оборудовании. Если вам нужно больше, либо добавьте ведомые устройства репликации, либо подумайте о чем-то вроде memcached.

Хотите спросить на StackOverflow?

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

Я бы посоветовал попробовать несколько разных способов, а затем перегрузить поиск с помощью ApacheBench и посмотреть, что под давлением быстрее всего уступит.