Eu estava experimentando com texto e varchars no mysql 5.7. Eu crio uma tabela mysql simples como abaixo
CREATE TABLEsmall_table
(pk
int(11) NOT NULL AUTO_INCREMENT,varc
varchar(255) DEFAULT NULL,txt
text, CHAVE PRIMÁRIA (pk
) ) ENGINE=InnoDB AUTO_INCREMENT=103925 DEFAULT CHARSET=utf8
A tabela tem cerca de 100 mil linhas.
Eu executei as consultas abaixo e perfilei as duas
Consulta 1 (Agrupar por na coluna varchar)
selecione varc,count(*) do grupo small_table por varc;
Resultado do perfil 1
+-----------+----------+ | Situação | Duração | +-----------+----------+ | começando | 0,000064 | | verificando permissões | 0,000004 | | Mesas de abertura | 0,004812 | | iniciar | 0,000026 | | Bloqueio do sistema | 0,000005 | | otimizando | 0,000006 | | estatísticas | 0,000010 | | preparando | 0,000006 | | Criando tabela tmp | 0,000021 | | Resultado da ordenação | 0,000003 | | executando | 0,000001 | | Envio de dados | 0,052795 | | Criando índice de classificação | 0,000049 | | fim | 0,000003 | | fim da consulta | 0,000006 | | removendo a tabela tmp | 0,000004 | | fim da consulta | 0,000002 | | mesas de fechamento | 0,000006 | | libertar artigos | 0,000021 | | limpeza | 0,000018 | +-----------+----------+
Detalhes da tabela temporária 1
+--------------+-------+ | Nome_variável | Valor | +--------------+-------+ | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 1 | +--------------+-------+
Consulta 2 (Agrupar por na coluna de texto)
selecione txt,count(*) do grupo small_table por txt;
Resultado do perfil 2
+----------------------+-----------+ | Situação | Duração | +----------------------+-----------+ | começando | 0,000134 | | verificando permissões | 0,000010 | | Mesas de abertura | 0,006690 | | iniciar | 0,000034 | | Bloqueio do sistema | 0,000007 | | otimizando | 0,000004 | | estatísticas | 0,000017 | | preparando | 0,000008 | | Criando tabela tmp | 0,000027 | | Resultado da ordenação | 0,000005 | | executando | 0,000002 | | Envio de dados | 26.359877 | | Criando índice de classificação | 0,001042 | | fim | 0,000007 | | fim da consulta | 0,000007 | | removendo a tabela tmp | 0,000208 | | fim da consulta | 0,000003 | | mesas de fechamento | 0,000007 | | libertar artigos | 0,000028 | | limpeza | 0,000020 | +----------------------+-----------+
Detalhes da tabela temporária 2
+--------------+-------+ | Nome_variável | Valor | +--------------+-------+ | Created_tmp_disk_tables | 1 | | Created_tmp_tables | 1 | +--------------+-------+
Ambos os perfis levaram quase o mesmo tempo em cada estágio, exceto 'Enviando estágio de dados'. Para o primeiro levou 0,052795s e para o segundo levou 26,359877s. Por que há tanta diferença nessa fase? (mesmas consultas sem agrupar por cláusula não mostram diferença em 'Enviando estágio de dados')
A diferença de desempenho se deve principalmente ao fato de que as colunas de tipo de dados de texto são sempre copiadas para tabelas temporárias no disco, porque o mecanismo de memória não suporta esses tipos.
Do manual :
Quando você não usa
group by
nenhuma tabela temporária é necessária, obviamente.