Mysql
 sql >> Database >  >> RDS >> Mysql

Il modo migliore per memorizzare i tag per la velocità in un tavolo enorme

Gli indici FULLTEXT non sono davvero così veloci come potresti pensare.

Usa una tabella separata per memorizzare i tuoi tag:

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
......

SELEZIONA tutti i contenuti con tag x utilizzando:

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;

A causa della chiave esterna, tutti i campi in tag_links sono indicizzati individualmente.
Il `WHERE tags ='test' seleziona 1 (!) record.
Equi si unisce a questo con 10.000 taglink.
E Equi si unisce a quello con 1 record di contenuto ciascuno (ogni tag_link punta sempre e solo a 1 contenuto).
A causa del limite 10, MySQL smetterà di cercare non appena ha 10 elementi, quindi in realtà esamina solo 10 record di tag_links.
Il content.id viene incrementato automaticamente, quindi numeri più alti sono un proxy molto veloce per gli articoli più recenti.

In questo caso tu mai devi cercare qualcosa di diverso dall'uguaglianza e inizi con 1 tag a cui equi-unisci usando chiavi intere (il join più veloce possibile).

Non ci sono se-allora-o-ma al riguardo, questo è il modo più veloce.

Tieni presente che poiché ci sono al massimo alcuni 1000 tag, qualsiasi ricerca sarà molto più veloce che approfondire l'intera tabella dei contenuti.

Finalmente
I campi CSV sono una pessima idea, non usarli mai in un database.