Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Melhor maneira de armazenar tags para velocidade em uma mesa enorme


Índices FULLTEXT realmente não são tão rápidos quanto você pensa que são.

Use uma tabela separada para armazenar suas tags:
Table tags
----------
id integer PK
tag varchar(20)

Table tag_link
--------------
tag_id integer foreign key references tag(id)
content_id integer foreign key references content(id)
/* this table has a PK consisting of tag_id + content_id */

Table content
--------------
id integer PK
......

Você SELECIONA todo o conteúdo com a tag x usando:
SELECT c.* FROM tags t
INNER JOIN tag_link tl ON (t.id = tl.tag_id)
INNER JOIN content c ON (c.id = tl.content_id)
WHERE tag = 'test'
ORDER BY tl.content_id DESC /*latest content first*/
LIMIT 10;

Por causa da chave estrangeira, todos os campos em tag_links são indexados individualmente.
O `WHERE tags ='test' seleciona 1 (!) registro.
Equi-junta isso com 10.000 taglinks.
E Equi-junta-se que com 1 registro de conteúdo cada (cada tag_link sempre aponta para 1 conteúdo).
Devido ao limite de 10, o MySQL parará de procurar assim que tiver 10 itens, então ele realmente só olha para 10 registros de tag_links.
/>O content.id é autoincrementável, então números mais altos são um proxy muito rápido para artigos mais novos.

Nesse caso, você nunca precisa procurar por qualquer coisa além de igualdade e você começa com 1 tag que você associa usando chaves inteiras (a junção mais rápida possível).

Não há se-então-ou-mas sobre isso, este é o caminho mais rápido.

Observe que, como existem no máximo 1.000 tags, qualquer pesquisa será muito mais rápida do que pesquisar o índice completo.

Finalmente
Campos CSV são uma péssima ideia, nunca use-os em um banco de dados.