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 |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
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. –
intente analizar la tabla ... http: //dev.mysql.com/doc/refman/5.0/en/analyze-table.html –
@Neville - Ya lo hice, dice que el estado es correcto. – stacker