Vejo que um dos comentários na pergunta menciona índices de cache
observe que apenas um índice será armazenado em cache no buffer pool (provavelmente PRIMÁRIO, mas verifique EXPLICAR para ter certeza). Você também pode precisar de índices secundários no cache, portanto, é necessário executar SELECTs adicionais
Acontece que eu tenho uma postagem Feb 04, 2012que permite que você faça essas consultas ( procedimento quente do MySQL ). A partir dessa postagem, aqui estão as consultas para mostrar todas as consultas que você precisa executar:
CARREGANDO INNODB BUFFER POOL
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,
' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM
(
SELECT
engine,table_schema db,table_name tb,
index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM
(
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(
SELECT engine,table_schema,table_name
FROM information_schema.tables WHERE
engine='InnoDB'
) B USING (table_schema,table_name)
WHERE B.table_schema NOT IN ('information_schema','mysql')
ORDER BY table_schema,table_name,index_name,seq_in_index
) A
GROUP BY table_schema,table_name,index_name
) AA
ORDER BY db,tb
CARREGANDO CACHE DE CHAVES MyISAM
SELECT DISTINCT CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,' ORDER
BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (SELECT engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (SELECT
B.engine,A.table_schema,A.table_name,A.index_name,A.column_name,A.seq_in_index
FROM information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine='MyISAM' AND table_schema
NOT IN ('information_schema','mysql')) B
USING (table_schema,table_name)
WHERE A.index_type <> 'FULLTEXT'
ORDER BY table_schema,table_name,index_name,seq_in_index) A
GROUP BY table_schema,table_name,index_name) AA
ORDER BY db,tb
;
CARREGANDO INNODB BUFFER POOL E CACHE DE CHAVES MyISAM
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(
SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
) B USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Basta redirecionar a saída para um arquivo de texto como /root/IndexWarmup.sql
Em seguida, faça o login no mysql e execute
mysql> source /root/IndexWarmup.sql
SUGESTÃO OPCIONAL
Eu recomendo atualizar para o MySQL 5.6. Por quê? Você pode fazer o seguinte:
Despeje e carregue um mapa do desligamento e inicialização do buffer pool do InnoDB
Com grandes conjuntos de dados, onde os dados não cabem na RAM, você aquecerá seu buffer pool - e além. Você vai destruir o buffer pool.
Sua consulta faz uma verificação completa da tabela. Assumindo que idé o PRIMARY KEY, você estará aquecendo toda a árvore de índices (embora não necessariamente linhas nem índices secundários).
Mas então você fará o mesmo para todas as suas tabelas e, eventualmente, ficará sem memória no pool, então você terá que evacuar as páginas (felizmente não sujas) do pool para abrir espaço para as mais novas.
Seja carregando apenas índices ou índice+dados, você acabará aquecendo as páginas e depois resfriando-as novamente. Eventualmente, o que permanecerá no pool é o último conjunto de páginas por ordem de carregamento cronológico.
Ah, e suas consultas resultarão em grandes transações que, por sua vez, colocarão mais bloqueios em seu banco de dados em execução...
A partir do MySQL 5.5, o InnoDB usa um algoritmo LRU modificado para evitar que as varreduras de tabela preencham o buffer pool. Por padrão, apenas 3/8 do buffer pool está disponível para varreduras de tabela.
No MySQL 5.6, isso foi aprimorado ainda mais, de modo que uma página deve estar no pool de buffers por 1000ms antes de poder ser promovida para a lista quente de 5/8 restantes.
Portanto, embora essa técnica tenha sido útil no passado, ela não é mais um método confiável para aquecer caches.
Vejo que um dos comentários na pergunta menciona índices de cache
Acontece que eu tenho uma postagem
Feb 04, 2012
que permite que você faça essas consultas ( procedimento quente do MySQL ). A partir dessa postagem, aqui estão as consultas para mostrar todas as consultas que você precisa executar:CARREGANDO INNODB BUFFER POOL
CARREGANDO CACHE DE CHAVES MyISAM
CARREGANDO INNODB BUFFER POOL E CACHE DE CHAVES MyISAM
Basta redirecionar a saída para um arquivo de texto como /root/IndexWarmup.sql
Em seguida, faça o login no mysql e execute
SUGESTÃO OPCIONAL
Eu recomendo atualizar para o MySQL 5.6. Por quê? Você pode fazer o seguinte:
Despeje e carregue um mapa do desligamento e inicialização do buffer pool do InnoDB
Despeje e carregue um mapa do InnoDB Buffer Pool sob demanda
Dessa forma, você nunca terá que ler páginas de índice no Buffer Pool que você nunca acessa.
Consulte a documentação do MySQL
Com grandes conjuntos de dados, onde os dados não cabem na RAM, você aquecerá seu buffer pool - e além. Você vai destruir o buffer pool.
Sua consulta faz uma verificação completa da tabela. Assumindo que
id
é oPRIMARY KEY
, você estará aquecendo toda a árvore de índices (embora não necessariamente linhas nem índices secundários).Mas então você fará o mesmo para todas as suas tabelas e, eventualmente, ficará sem memória no pool, então você terá que evacuar as páginas (felizmente não sujas) do pool para abrir espaço para as mais novas.
Seja carregando apenas índices ou índice+dados, você acabará aquecendo as páginas e depois resfriando-as novamente. Eventualmente, o que permanecerá no pool é o último conjunto de páginas por ordem de carregamento cronológico.
Ah, e suas consultas resultarão em grandes transações que, por sua vez, colocarão mais bloqueios em seu banco de dados em execução...
A partir do MySQL 5.5, o InnoDB usa um algoritmo LRU modificado para evitar que as varreduras de tabela preencham o buffer pool. Por padrão, apenas 3/8 do buffer pool está disponível para varreduras de tabela.
No MySQL 5.6, isso foi aprimorado ainda mais, de modo que uma página deve estar no pool de buffers por 1000ms antes de poder ser promovida para a lista quente de 5/8 restantes.
Portanto, embora essa técnica tenha sido útil no passado, ela não é mais um método confiável para aquecer caches.