2011-10-25 16 views
5

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    | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
+0

È 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. –

+0

prova analizza tabella ... http: //dev.mysql.com/doc/refman/5.0/en/analyze-table.html –

+0

@Neville - L'ho già fatto, si dice che lo stato è ok. – stacker

risposta

0

Ho risolto il problema reinstallando mysql 5.5.17 e ho deciso di non utilizzare l'impostazione 'Developer Machine', ho usato le impostazioni predefinite per 'Server Machine'. Dopo che la query viene eseguita in pochi secondi (1a volta) la query successiva esegue molto meglio.

Suppongo che in modalità sviluppatore mysql sia configurato per salvare ram e non bufferizza abbastanza pagine indice per tabelle di grandi dimensioni.

La (ri) configurazione può da compiuta con MYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

un confronto dei file vecchi e nuovi di configurazione mostra che questi valori sono stati modificati durante la configurazione:

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

Come suggerito in un commento, il tuo 'innodb_buffer_pool' è aumentato. È possibile farlo manualmente modificando il file my.cnf o riconfigurando l'istanza attraverso quella GUI. In entrambi i casi, il set di dati di lavoro risiede ora nella memoria. In altre parole, potrebbe essere ancora lento di tanto in tanto. –

+0

@ N.B. Mi spiace, non ho capito cosa intendevi per "set di dati di lavoro". Ora tutto è chiaro se pubblichi il tuo commento come risposta lo accetterò. Grazie per il tuo aiuto. – stacker

+0

Va tutto bene, non sto "cercando" un rappresentante, la tua risposta e i commenti renderanno le cose chiare per il prossimo con lo stesso problema :) –

1

Forse i tavoli sono molto frammentati e MySQL deve andare su tutto il disco per andare a prendere quei 5021 righe?

Problemi correlati