Fondamentalmente siamo molto soddisfatti delle prestazioni di Mysqls, query simili sono completate in una frazione di secondo. Ora ci troviamo di fronte un problema con questa queryCosa potrebbe diminuire le prestazioni di 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
Ci vogliono 50 secondi per andare a prendere 5021 righe. Un indice mancante è probabilmente la causa più comune di problemi del genere. Quindi ho preceduto la query da EXPLAIN e ho ottenuto questo piano di query che mostra che solo gli indici non sono utilizzati scansioni sequenziali.
Le tabelle dmr e dma hanno 3 milioni di righe ciascuna, dc ha 6000 righe.
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
| 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 |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
Cosa potrebbe causare questo problema?
La versione di MySql è 5.5 che utilizza InnoDB come motore. (Solo i parametri predefiniti su Windows).
EDIT
Quando rimuovo la clausola where, mysql restituisce il (enorme) set di risultati immediatamente. Il piano di query, in questo caso si presenta come:
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
| 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 |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
È molto probabilmente I/O vincolato dal disco rigido. Aumenta la variabile di dimensione 'innodb_buffer_pool' al 70% della tua RAM. In questo modo la parte del set di dati di lavoro sarà conservata in memoria e la ricerca sarà molto più veloce. –
prova analizza tabella ... http: //dev.mysql.com/doc/refman/5.0/en/analyze-table.html –
@Neville - L'ho già fatto, si dice che lo stato è ok. – stacker