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

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

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

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

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

решение1

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

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

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

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

Подумайте, стоит ли задавать вопросы на StackOverflow?

решение2

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

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

Связанный контент