2010-08-07 14 views
10

Ho un'applicazione di e-commerce che usa MySQL e mi piacerebbe che fosse più veloce. Quando si accede a una parte # sul sito Web a cui è stato effettuato l'accesso in precedenza, la parte viene caricata rapidamente poiché tutti i dati necessari sono già nel pool buffer INNODB. Tuttavia, se la parte # non è mai stata caricata prima, quei dati non sono ancora nel pool buffer, quindi devono essere letti dal disco e ciò è lento. Ho impostato il pool buffer INNODB da 2 GB e l'intero database ha una capacità di circa 350 MB, pertanto è disponibile spazio sufficiente per caricare l'intero database nel pool di buffer. Posso vedere dalle statistiche INNODB che solo circa la metà del pool di buffer viene utilizzata al momento.Come precaricare le tabelle nel pool buffer INNODB con MySQL?

Ho trovato riferimenti al precaricamento dei dati, noto anche come "riscaldamento" del pool di buffer, ad esempio Quickly preloading Innodb tables in the buffer pool o mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole .html. La strategia consiste essenzialmente nel forzare una scansione della tabella su ogni tabella poiché MySQL non ha un modo nativo per il precaricamento dei dati.

Non voglio creare manualmente uno script che elenchi ogni singola tabella nel mio database e debba farlo. Come posso creare uno script che attraversa e fa una selezione per ogni tabella automaticamente e seleziona automaticamente una colonna non indicizzata in modo che venga eseguita una scansione della tabella?

risposta

0

Questa query restituirà i nomi di tabella nel database, in modo da non necessario inserire manualmente:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

Poi, per ogni nome di tavolo forza scansione.

22

Questo dovrebbe dare un elenco di query da eseguire;)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

si può mettere in stored procedure, e andare oltre il gruppo di risultati con il cursore. Crea una dichiarazione preparata da ogni riga ed esegui.

+3

questo algoritmo è semplicemente conciso e brillante. Questo memorizzerà nella cache i dati innodb. Non sono sicuro se questo memorizzerà nella cache tutte le pagine indice innodb, ma il tuo algoritmo può essere rapidamente applicato per farlo. Credo che MyISAM memorizzi solo le pagine dell'indice MYI. Di nuovo, il tuo algoritmo costituisce la base per passare attraverso tabelle e indici. Bravo (e +1) !!!! – RolandoMySQLDBA

+1

Il mio è solo implementazione per ottenere un elenco di query. L'idea viene dal Mysql Performance Blog collegato nella domanda. – Mchl

Problemi correlati