Esta solução parece fazer o trabalho (roubada quase literalmente de esta página ). Requer um
auxiliary
tabela, preenchida com números sequenciais de 1 a pelo menos o número esperado de palavras distintas. Isso é muito importante para verificar se a tabela auxiliar é grande o suficiente, ou os resultados estarão errados (não mostrando nenhum erro). SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(maintable.comment, ' ', auxiliary.id), ' ', -1) AS word,
COUNT(*) AS frequency
FROM maintable
JOIN auxiliary ON
LENGTH(comment)>0 AND SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id), ' ', -1)
<> SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id-1), ' ', -1)
GROUP BY word
HAVING word <> ' '
ORDER BY frequency DESC;
SQL Fiddle
Essa abordagem é tão ineficiente quanto possível, porque não pode usar nenhum índice.
Como alternativa, usaria uma tabela de estatísticas que manteria atualizada com os gatilhos. Talvez inicialize a tabela de estatísticas com o acima.