FULLTEXT-index är verkligen inte så snabba som du kanske tror att de är.
Använd en separat tabell för att lagra dina taggar:
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
......
Du VÄLJER allt innehåll med taggen x genom att använda:
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;
På grund av den främmande nyckeln indexeras alla fält i tag_links individuellt.
WHERE-taggarna ='test' väljer 1 (!) post.
Equi-ansluter till detta med 10 000 taglänkar.
Och Equi-ansluter det med 1 innehållspost vardera (varje tag_link pekar bara på 1 innehåll).
På grund av gränsen 10 kommer MySQL att sluta leta så fort den har 10 objekt, så den tittar egentligen bara på 10 tag_links-poster.
Content.id ökar automatiskt, så högre siffror är mycket snabb proxy för nyare artiklar.
I det här fallet du aldrig behöver leta efter något annat än jämlikhet och du börjar med 1 tagg som du equi-join med hjälp av heltalsnycklar (snabbaste möjliga join).
Det finns inga om-då-eller-men om det, detta är det snabbaste sättet.
Observera att eftersom det finns högst några 1000 taggar, kommer alla sökningar att gå mycket snabbare än att gräva i den fullständiga innehållstabellen.
Äntligen
CSV-fält är en mycket dålig idé, använd då aldrig i en databas.