%2C%20MyISAM%20%D0%B8%D0%BB%D0%B8%20%D1%87%D1%82%D0%BE-%D1%82%D0%BE%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B5%20(%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20MemCached).png)
В настоящее время работаю над проектом, который сосредоточен вокруг медицинского словаря, известного как 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 и посмотреть, что быстрее всего поддастся давлению.