Consulta rápida de un gran conjunto de datos: motor MySQL MEMORY (HEAP), MyISAM u otra cosa (por ejemplo, MemCached)

Consulta rápida de un gran conjunto de datos: motor MySQL MEMORY (HEAP), MyISAM u otra cosa (por ejemplo, MemCached)

Actualmente estoy trabajando en un proyecto que se centra en un vocabulario médico conocido como SNOMED. En el corazón de snomed hay un conjunto de datos (relacional) que tiene 350.000 términos/registros de longitud. Queremos poder consultar rápidamente este conjunto de datos para la parte de entrada de datos donde nos gustaría tener alguna forma de autocompletado/sugerencia.

Actualmente está en una base de datos MySQL MyISAM solo para fines de desarrollo, pero queremos comenzar a jugar con algunas opciones en la memoria. Actualmente tiene 30 MB, incluidos los índices. MEMORY MySQL Engine y MemCached fueron los más obvios, así que mi pregunta es ¿cuál de ellos sugeriría o hay algo mejor disponible? Estamos trabajando en Python principalmente a nivel de aplicación si eso marca la diferencia.

Nota al margen: El conjunto de datos tiene una relación separada que asigna estos conceptos a abreviaturas y nombres de alias comunes que son aproximadamente 1,3 millones de registros... eventualmente querremos usar un subconjunto de esto también aquí.

Respuesta1

No está claro exactamente cuáles son sus requisitos, pero con una base de datos tan pequeña, es probable que las consultas sean rápidas en cualquier motor, ya que todos los datos caben en la memoria.

Cosas como MyISAM e InnoDB requieren algunos ajustes para funcionar. Memcached sólo es útil si necesita escalar a cargas de trabajo basadas en lectura de carga muy alta, es decir, aquellas que son demasiado altas para que un solo servidor las sirva desde una base de datos en memoria convencional (la característica principal de Memcached es la capacidad de escalar a través de un grupo). de servidores). Pero Memcached no puede realizar consultas convencionales como escaneos de rango, solo búsquedas en una clave específica, por lo que no es una base de datos de propósito general.

Recomendaría usar innodb con un grupo de búfer más grande que su conjunto de datos y elegir sus claves principales correctamente. Un escaneo de rango de clave principal debería funcionar muy bien y debería poder usarse para la coincidencia de prefijos (por ejemplo, casos de uso de finalización).

Podrá escalar a, digamos, 1000 consultas por segundo con eso en hardware normal. Si necesita más, agregue esclavos de replicación o considere algo como memcached.

¿Considera preguntar en StackOverflow?

Respuesta2

Puede mantener la tabla como tipo MEMORIA. Sería bastante rápido, aunque requeriría sembrarlo antes de usarlo. Tengo la sensación de que se le puede sacar mucho rendimiento. Al estar en memoria, es ciertamente más rápido que InnoDB y MyISAM para operaciones de lectura.

Yo diría que lo intente de diferentes maneras y luego sobrecargue la búsqueda con ApacheBench, vea qué sucumbe más rápidamente bajo presión.

información relacionada