Resposta do Community Wiki gerada a partir de comentários sobre a pergunta de Raymond Nijland
Use EXPLAIN
. Dessa forma, você pode ver se uma consulta PODE precisar de disco IO. Você precisa evitar na coluna extra "Usando temporário" ou "" Usando temporário; Usando filesort (observe que filesort é um nome enganoso: se o conjunto de resultados couber na memória, o quicksort é executado na memória) ".
É mais provável que isso seja causado por subconsultas / uniões / ordem por / agrupar por / ... Se o resultado for grande e uma tabela temporária baseada em disco do MyISAM for criada, e você precisar classificar o resultado, está classificando o resultado definido com base nas leituras de E / S e gravações de E / S com o algoritmo quicksort.
Em Uso de tabela temporária interna no MySQL, você pode ler quando o MySQL precisar criar uma tabela MyISAM baseada em disco. Talvez você possa usar linhas avg_row_length * (embora observe que o valor das linhas de explicação não é exato no mecanismo do InnoDB) para verificar se o resultado se encaixa na pilha. Consulte Sintaxe SHOW TABLE STATUS .
Em geral, o InnoDB ou o MyISAM é melhor para evitar solicitações de E / S?
O InnoDB armazenará em buffer os dados da tabela e os dados do índice, enquanto o MyISAM somente armazenará em buffer as chaves do índice. Uma E / S para os dados da tabela é necessária quando a coluna de explicação extra não diz "Usando índice".
Se ambos estiverem usando índices: Com o InnoDB, se o buffer estiver quente, ele poderá carregar dados da memória. Se os índices precisarem vir do disco, existe uma fórmula que você pode usar para calcular leituras de E / S necessárias para seleções, inserções e atualizações. De Estimativa de desempenho de consulta :
Para tabelas pequenas, geralmente você pode encontrar uma linha em uma busca de disco (porque o índice provavelmente está armazenado em cache). Para tabelas maiores, é possível estimar que, usando índices da árvore B, você precisa deste número de buscas para encontrar uma linha:
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
Os índices do InnoDB são maiores porque armazenam dados da chave PRIMARY / UNIQUE em um índice KEY. Isso é mais rápido e precisa de menos procura de E / S, mas você pode compactar dados ou índices do InnoDB.