【发布时间】:2011-11-08 22:50:37
【问题描述】:
我正在开发一个大型内容网站,其中包含一个“内容”表,其中包含超过 5000 万条记录。这是表结构:
contain id(INT11 INDEX),
name(varchar150 FULLTEXT),
description (text FULLTEXT),
date(INT11 INDEX)
我想给这些内容添加一个“标签”。
我认为有两种方法:
在表格内容中创建一个 varchar(255 FULLTEXT)“标签”列。存储以逗号分隔的所有标签,并使用 MATCH & AGAINS 逐行搜索(我认为这会很慢)。
制作 2 张桌子。第一个表名“tags”与列 id、tag(varchar(30 INDEX 或 FULLTEXT?))、“contents_tags”与 id、tag_id (int11 INDEX) 和 content_id (int11 INDEX) 并通过 3 个表的 JOINS (contents - contents_tags - tags) 以检索带有标签的所有内容。
我认为这是缓慢且内存杀手,因为 50M 的 ENORMOUS JOIN 表 * contents_tags * 标签。
存储标签以使其尽可能高效的最佳方法是什么?按文本搜索(例如“movie 3d 2011”和简单标签“video”)并定位内容的最快方法是什么?
表的大小(现在大约 5Gb,没有标签)。该表是一个MYISAM,因为我需要将FULLTEXT中的表内容的名称和描述存储到字符串搜索(用户现在可以通过此字段搜索),并且需要通过标签搜索的最佳速度。
有这方面的经验吗?
谢谢!
【问题讨论】:
-
如果您使用(唯一)键加入(
(eq_)refjoin),您的巨大的加入将不会那么庞大。试试吧,这就是要走的路。 -
@Konerak 应该是回答,而不是评论
标签: php mysql database performance