2011-11-27 15 views
11

Ho appena acceso il slow query logging sul mio database MySQL, aggiungendo quanto segue al /etc/mysql/my.cnf:Che cosa significa "SELECT/*! N SQL_NO_CACHE */* FROM` mytable`" significare in nel registro query lente di MySQL?

log_slow_queries = /var/log/mysql/mysql-slow.log 
long_query_time = 1 

Quando eseguo mysqldumpslow, si emette il seguente:

Reading mysql slow query log from mysql-slow.log 
Count: 1 Time=199.23s (199s) Lock=0.00s (0s) Rows=32513.0 (32513), ... 
SELECT /*!N SQL_NO_CACHE */ * FROM `mytable` 

... 

Guardando l'originale mysql-slow.log, la query completo era:

SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`; 

Così mysqldumpslow appena sostituito il numero con N (per facilitare l'aggregazione di query simili)

Quindi, la domanda è: da dove viene questa query e cosa significa il bit /*!40001 SQL_NO_CACHE */?

Come meglio posso dire, è probabilmente da un comando mysqldump che stava facendo un backup (quindi non volendo dati memorizzati nella cache), sembra giusto? E se sì, visto che legge solo 32.000 righe, perché ci sono voluti 199?

Ci sono un mucchio di query più simili su altri tavoli che richiedono 100, 50, fino a un 3 più ragionevole, la maggior parte con circa 10-20.000 righe, la più grande con 450.000 righe.

+0

forse potresti accettare la risposta migliore qui sotto? – rubo77

risposta

4

La query è probabilmente 'lenta' perché il client (il vostro sistema di backup) si trova a dover leggere ogni riga della tabella; che sta prendendo apparentemente 199 secondi.

Nota che se hai fatto qualcosa di simile:

SELECT * FROM table LIMIT 100; 

// read 50 rows 

// sleep for 5 minutes 

// read last 50 rows 

La query sopra sarebbe visualizzato nel registro lento, perché da quando è iniziato, a quando potrebbe finire (con l'invio di voi l'ultima riga richiesta) ci sono voluti 5 minuti.

+1

Ma il "sistema di backup" è mysqldump, sicuramente non ci vogliono 200 secondi per scrivere 32.000 righe? – Tom

+2

In realtà, se sta inviando su ssh (tramite gzip) che potrebbe tenerlo aperto finché i dati non sono tutti trasferiti ... – Tom

+0

Fai una SHOW PROCESSLIST quando la query è in esecuzione, se il suo stato è 'writing to net' (I pensa) quindi invia i dati con la stessa velocità con cui l'altro utente lo sta elaborando. – Andrew

22

Il /*!40001 SQL_NO_CACHE */ significa che nelle versioni di mysql> = 4.0.1 eseguire SELECT SQL_NO_CACHE * FROM mytable e nelle versioni precedenti eseguire il comando senza SQL_NO_CACHE.

anche mysqldump fa usare la sintassi /*!40001 SQL_NO_CACHE */.

io non sono sicuro perché le vostre domande sarebbero così lento.

+0

Ah, un numero di versione! Ho pensato che potrebbe essere stato un codice di errore o qualcosa del genere. È bello sapere, c'è qualche documentazione per quella sintassi? – Tom

+0

Sì, è possibile trovare alcune informazioni sul sito MySQL all'indirizzo: http://dev.mysql.com/doc/refman/5.1/en/comments.html –

+0

Questa dovrebbe essere la risposta corretta. Non credo che la domanda principale fosse: "Perché le mie domande sono lente?" Almeno non nel titolo –

3

Una questione di ottimizzazione può essere considerata da parte dell'utente per rendere questa query eseguita più velocemente di quanto, btw, SQL_NO_CACHE significa che questa query verrà eseguita senza essere idonea per essere archiviata nella cache della query. Ad esempio, è possibile utilizzare questo suggerimento, SQL_NO_CACHE, per evitare questa query da memorizzare nella cache in modo da verificare che il tempo di esecuzione.

Check it out: http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html

ulteriori suggerimenti per utilizzare in query: http://www.petefreitag.com/item/613.cfm

Cheers, WB

-1

dal mio lavoro, ho anche affrontato lo stesso problema Poi ho provato in due modi per risolvere esso.

In primo luogo, ho aumentare la dimensione mysql_query_cache e aumentare lo spazio in macchina locale.

In secondo luogo, ho controllato la dimensione del server remoto mysql_query_cache e aumentato lo spazio della directory temporanea.

Perché, dalla ricerca ho ricavato che questo sistema funziona in entrambi i modi e ci dà l'impressione che dobbiamo aumentare lo spazio nel luogo specifico.

Quindi, essere specifico quale mysqldum si sta utilizzando e controllare la versione anche per entrambi i sistemi. Poiché anche la versione diversa si comporta in modo leggermente diverso.

+2

Non riesco a vedere come questo risponde alla domanda fatta? – Carpetsmoker

+0

Ho ricevuto lo stesso errore e l'ho risolto con quei passaggi. Voglio dire che non è correlato al log delle query lento. Riguarda la dimensione dello spazio nel sistema. Ecco come la risposta è correlata alla domanda. – Sumsun

+1

Ma questa domanda non riguarda un errore, ma chiedere una spiegazione su cosa significa qualcosa? – Carpetsmoker

Problemi correlati