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.