Các chỉ mục FULLTEXT thực sự không nhanh như bạn nghĩ.
Sử dụng một bảng riêng để lưu trữ các thẻ của bạn:
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
......
Bạn CHỌN tất cả nội dung có thẻ x bằng cách sử dụng:
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;
Do có khóa ngoại, tất cả các trường trong tag_links đều được lập chỉ mục riêng.
`` WHERE tags ='test' chọn 1 bản ghi (!).
Trang bị cho kết hợp này với 10.000 taglinks.
Và Trang bị tham gia điều đó mỗi bản ghi 1 nội dung (mỗi tag_link chỉ trỏ đến 1 nội dung).
Vì giới hạn 10, MySQL sẽ ngừng tìm kiếm ngay khi nó có 10 mục, vì vậy nó thực sự chỉ xem 10 bản ghi tag_links.
Content.id đang tự động gia tăng, vì vậy các con số cao hơn là proxy rất nhanh cho các bài viết mới hơn.
Trong trường hợp này, bạn không bao giờ cần tìm kiếm bất kỳ thứ gì khác ngoài sự bình đẳng và bạn bắt đầu bằng 1 thẻ mà bạn trang bị cho phép nối bằng cách sử dụng các khóa số nguyên (phép nối nhanh nhất có thể).
Không có if-thens-or-buts về nó, đây là cách nhanh nhất.
Lưu ý rằng vì có nhiều nhất là vài 1000 thẻ, bất kỳ tìm kiếm nào sẽ nhanh hơn nhiều so với việc tìm kiếm trong bảng nội dung đầy đủ.
Cuối cùng Các trường
CSV là một ý tưởng rất tồi, không bao giờ được sử dụng sau đó trong cơ sở dữ liệu.