2011-10-25 14 views
5

Básicamente estamos muy contentos con el rendimiento de Mysqls, las consultas similares se completan en una fracción de segundo. Ahora nos enfrentamos a un problema con esta consulta¿Qué podría disminuir el rendimiento de MySqls?

SELECT dc.id,dmr.art_id 
FROM dmr 
JOIN dma ON dma.id = dmr.dml_id 
JOIN dc ON dc.id = dma.dc_id 
WHERE dmr.art_id = 2285 

Se tarda 50 segundos a buscar a 5021 filas. Un índice faltante es probablemente la causa más común de problemas como ese. Así que precedí a la consulta de EXPLAIN y obtuve este plan de consulta que muestra que solo los índices se utilizan sin escaneos secuenciales.

Las tablas dmr y dma tienen 3 millones de filas cada una, dc tiene 6000 filas.

+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| id | select_type | table | type | possible_keys     | key   | key_len | ref    | rows | Extra  | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825,ix_art_ref | ix_art_ref  | 5  | const    | 5021 | Using where | 
| 1 | SIMPLE  | dma | eq_ref | PRIMARY,FK8C6E1445153BBDC9 | PRIMARY  | 8  | dev.dmr.dml_id  | 1 |    | 
| 1 | SIMPLE  | dc | eq_ref | PRIMARY      | PRIMARY  | 8  | dev.dma.dc_id  | 1 | Using index | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 

¿Qué podría causar este problema?

La versión de MySql es 5.5 usando InnoDB como motor. (Solo parámetros por defecto en windows).

EDITAR

Cuando quito la cláusula where, MySQL devuelve el (enorme) conjunto de resultados de inmediato. El plan de consulta en este caso es así:

+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| id | select_type | table | type | possible_keys    | key    | key_len | ref  | rows | Extra     | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| 1 | SIMPLE  | dc | index | PRIMARY     | FKAEB144C64FA71464 | 9  | NULL  | 4037 | Using index    | 
| 1 | SIMPLE  | dma | ref | PRIMARY,FK8C6E1445153BBDC9 | FK8C6E1445153BBDC9 | 9  | dev.dc.id | 263 | Using where; Using index | 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825   | FKC33D5199F17E1825 | 9  | dev.dma.id | 1 | Using where    | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
+0

Usted Lo más probable es que la E/S esté unida al disco duro. Aumente la variable de tamaño 'innodb_buffer_pool' al 70% de su RAM. De esa forma, parte del conjunto de datos en funcionamiento se mantendrá en la memoria y la búsqueda será mucho más rápida. –

+0

intente analizar la tabla ... http: //dev.mysql.com/doc/refman/5.0/en/analyze-table.html –

+0

@Neville - Ya lo hice, dice que el estado es correcto. – stacker

Respuesta

0

Resolví el problema reinstalando mysql 5.5.17 y decidí no usar la configuración 'Developer Machine', utilicé la configuración predeterminada para 'Server Machine'. Después de que la consulta se realiza en unos pocos segundos (1ª vez) la consulta posterior realizar mucho mejor.

Supongo que en el modo de desarrollador, mysql está configurado para guardar RAM y no almacena en búfer suficientes páginas de índice para tablas grandes.

La (re) configuración puede por consumado con MYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

Una comparación de los ficheros de configuración antiguos y nuevos muestra que estos valores se cambiaron durante la configuración:

tmp_table_size=103M old 18M 
myisam_sort_buffer_size=205M old 35M 
key_buffer_size=175M old 25M 
innodb_additional_mem_pool_size=7M old 3499K 
innodb_additional_mem_pool_size=2M old 1M 
innodb_buffer_pool_size=339M old 47M 
+0

Como se sugiere en un comentario, su 'innodb_buffer_pool' aumentó. Puede hacerlo manualmente editando el archivo my.cnf o reconfigurando la instancia a través de esa GUI. De cualquier manera, su conjunto de datos de trabajo reside en la memoria ahora. En otras palabras, todavía puede ser lento de vez en cuando. –

+0

@ N.B. Lo siento mal, no entendí lo que quería decir con "conjunto de datos en funcionamiento". Ahora todo está claro si publica su comentario como respuesta. Lo aceptaré. Gracias por tu ayuda. – stacker

+0

Está todo bien, no estoy "buscando" representante, su respuesta y los comentarios dejarán las cosas claras para el siguiente tipo con el mismo problema :) –

1

Tal vez las mesas están muy fragmentados y MySQL tiene que pasar por todo el disco en busca de esos 5021 filas?

Cuestiones relacionadas