2009-03-23 10 views
5

Actualmente estoy ejecutando algunas consultas SELECT intensivas en una tabla MyISAM. La tabla tiene alrededor de 100 MiB (800,000 filas) y nunca cambia.Alternativas al motor de almacenamiento MEMORY para MySQL

Necesito aumentar el rendimiento de mi script, así que estaba pensando en mover la tabla de MyISAM al motor de almacenamiento MEMORY, para poder cargarla completamente en la memoria.

Además del motor de almacenamiento MEMORY, ¿cuáles son mis opciones para cargar una tabla de 100 MiB en la memoria?

+0

ejecute un 'MOSTRAR CREAR TABLA' en su tabla y publique el resultado para que podamos ver la estructura de la tabla y los índices . Algunas consultas SELECT de muestra también deberían ser excelentes. –

+0

http://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the-memory-storage-engine-in-mysql – zloctb

Respuesta

4

Una tabla con 800k filas no debería ser ningún problema para mysql, independientemente del motor de almacenamiento que esté utilizando. Con un tamaño de 100 MB, la tabla completa (datos y claves) debe residir en la memoria (mysql key cache, OS file cache, o propably en ambos).

Primero verifica los índices. En la mayoría de los casos, la optimización de los índices le brinda el mejor impulso al rendimiento. Nunca hagas nada más, a menos que estés seguro de que están en forma. Invoque las consultas utilizando EXPLAIN y esté atento a los casos en los que no se utiliza el índice o el índice incorrecto.Esto debe hacerse con datos del mundo real y no en un servidor con datos de prueba.

Después de optimizar sus índices, las consultas deben finalizar en una fracción de segundo. Si las consultas son demasiado lentas, intente evitar ejecutarlas utilizando un caché en su aplicación (memcached, etc.). Dado que los datos de la tabla nunca cambian, no debería haber problemas con los datos de la memoria caché anterior, etc.

0

Suponiendo que los datos rara vez cambian, podría aumentar significativamente el rendimiento de las consultas utilizando MySql query caching.

+1

Estaba buscando en Memcache y algunas otras soluciones de caché, pero el problema con las consultas de caché es que rara vez son las mismas consultas. La mayoría de las veces es una consulta diferente que se llamará solo una vez. –

0

Si su tabla es consultada mucho, probablemente ya esté almacenada en caché en el nivel del sistema operativo, dependiendo de la cantidad de memoria que tenga su servidor.

MyISAM también permite precargar índices de tabla MyISAM en la memoria utilizando un mecanismo llamado MyISAM Key Cache. Después de crear un caché de claves, puede cargar un índice en el caché utilizando la sintaxis CACHE INDEX o LOAD INDEX.

Supongo que ha analizado su tabla y consultas y optimizado sus índices después de las consultas reales? De lo contrario, eso es algo que debes hacer antes de intentar almacenar toda la tabla en la memoria.

+0

Ya he optimizado la tabla y mis consultas. Mi estructura de la tabla es algo similar a esto: Identificación del nombre apellido edad Estado sexo callejero ciudad número ... Y la mayoría de mis consultas tener este aspecto: SELECT FROM tabla WHERE nombre de la columna = 'parámetro de búsqueda' –

0

Si tiene suficiente memoria asignada para el uso de Mysql: en el grupo de búferes Innodb, o para MyIsam, puede leer la base de datos en la memoria (solo 'SELECT * from tablename') y si no hay motivo para eliminar eso, se queda allí.

También obtiene un mejor uso de la clave, ya que la tabla MEMORY solo utiliza claves hash, en lugar de acceso completo btree, que para las claves pequeñas y no exclusivas puede ser suficiente o no tanto para una tabla tan grande .

Como siempre, lo mejor es hacerlo para compararlo.

Otra idea es, si está utilizando v5.1, utilizar un tipo de tabla ARCHIVE, que se puede comprimir, y también puede acelerar el acceso a los contenidos, si son fácilmente compresibles. Esto intercambia el tiempo de la CPU para descomprimir el acceso IO/memoria.

0

Si los datos nunca cambian, podría duplicar fácilmente la tabla en varios servidores de bases de datos.

De esta manera podría descargar algunas consultas a un servidor diferente, ganando algo de espacio extra para el servidor principal.

La mejora de la velocidad depende de la carga de la base de datos actual, no habrá mejoras si la carga de la base de datos es muy baja.

PS:
¡Usted sabe que las tablas de MEMORIA olvidan su contenido cuando la base de datos se reinicia!

Cuestiones relacionadas