Os recursos de manipulação de texto do MySQL não são bons o suficiente para o que você deseja. Uma função armazenada é uma opção, mas provavelmente será lenta. Sua melhor aposta para processar os dados no MySQL é adicionar um função definida pelo usuário . Se você for construir uma versão mais recente do MySQL, você também pode adicionar um função nativa .
A maneira "correta" é processar os dados fora do banco de dados, pois os bancos de dados são para armazenamento, não para processamento, e qualquer processamento pesado pode sobrecarregar muito o DBMS. Além disso, calcular a contagem de palavras fora do MySQL torna mais fácil alterar a definição do que conta como uma palavra. Que tal armazenar a contagem de palavras no banco de dados e atualizá-la quando um documento for alterado?
Exemplo de função armazenada:
DELIMITER $$
CREATE FUNCTION wordcount(str LONGTEXT)
RETURNS INT
DETERMINISTIC
SQL SECURITY INVOKER
NO SQL
BEGIN
DECLARE wordCnt, idx, maxIdx INT DEFAULT 0;
DECLARE currChar, prevChar BOOL DEFAULT 0;
SET maxIdx=char_length(str);
SET idx = 1;
WHILE idx <= maxIdx DO
SET currChar=SUBSTRING(str, idx, 1) RLIKE '[[:alnum:]]';
IF NOT prevChar AND currChar THEN
SET wordCnt=wordCnt+1;
END IF;
SET prevChar=currChar;
SET idx=idx+1;
END WHILE;
RETURN wordCnt;
END
$$
DELIMITER ;