No MySQL/MariaDB eu tenho esta tabela com linhas de comprimento fixo (sem VARCHAR, TEXT, etc)
CREATE TABLE trigram (
id BIGINT(20) NOT NULL,
trigram CHAR(3) NOT NULL COLLATE 'utf8mb4_general_ci',
PRIMARY KEY (trigram, id) USING BTREE,
INDEX id (id) USING BTREE
)
COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT;
A tabela tem dezenas de megarows e obtém consultas de produção neste formato
SELECT id FROM trigram
WHERE trigram IN ('dba', 'ba.', 'a.s', '.st', 'sta', 'tac', 'ack')
GROUP BY ID HAVING COUNT(*) = 7
bem como INSERTs e DELETE FROM trigram WHERE id = 12345
consultas de manutenção. Os índices são apropriados para os padrões de consulta da tabela.
Esta tabela é um índice trigrama do homem pobre. (Este pobre homem não pode atualizar para o postgreSQL e usar seus índices trigramas integrados, suspiro.) A consulta de exemplo procura id
s que contenham strings 'dba.stack'. É muito mais rápido do que content_column LIKE '%dba.stack%'
quando a tabela de trigramas é construída.
Editar: O que quero dizer com "melhor"? Mais rápido, mais confiável, menos liberação do buffer pool na produção, menos carga de manutenção para usuários que não são DBA.
Pergunta: Devo definir esta tabela de linhas de comprimento fixo com ROW_FORMAT=COMPACT? Ou é necessário DYNAMIC? Percebi que ocupa um pouco menos espaço em disco com o COMPACT.
Pergunta: Alguma outra sugestão ou aspecto de desempenho com que se preocupar?
Meus usuários (usuários do software WordPress.org) estão principalmente no MariaDB 10.3+, mas alguns estão no MySQL 8 e alguns estão no MySQL 5.7-. Não preciso oferecer suporte a material legado do Antelope ou MyISAM.
Outra edição:
Minha IN()
consulta faz uma varredura de intervalo em um conjunto de dados de teste com 180 mil linhas na tabela. A JOIN
tabela UNION sugerida em uma resposta faz um loop aninhado. A varredura de alcance leva menos tempo. Verdadeiro no MariaDB 10.11, MySQL 8 e MySQL 5.7. Pelo que vale a pena. Parece que a otimização do skip-scan funciona muito bem.