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.