FULLTEXT-индексы на самом деле не так быстры, как вы думаете.
Используйте отдельную таблицу для хранения ваших тегов:
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
......
ВЫ ВЫБИРАЕТЕ все содержимое с тегом x, используя:
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;
Из-за внешнего ключа все поля в tag_links индексируются индивидуально.
Тест WHERE tags = 'выбирает 1 (!) Запись.
Уравнивает это с10 000 тегов.
И Equi-joins , которые с 1 записью контента каждая (каждая tag_link указывает только на 1 контент).
Из-за ограничения 10 MySQL перестанет искать, как толькоимеет 10 элементов, так что в действительности он просматривает только 10 записей tag_links.
content.id является автоинкрементным, поэтому большие числа являются очень быстрым прокси для новых статей.
В этом случае вы никогда нужно искать что-либо, кроме равенства, и вы начинаете с 1 тега, который вы равняете соединению, используя целочисленные ключи (самое быстрое соединение из возможных).
В этом нет «если-то-или-но», это самый быстрый способ.
Обратите внимание, что, поскольку существует не более нескольких 1000 тегов, любой поиск будет намного быстрее, чем копирование в таблице полного содержимого.
Наконец,
CSV-поляочень плохая идея, никогда не используйте ее в базе данных.