【发布时间】:2011-09-07 21:07:27
【问题描述】:
我已经建立了一个名人照片网站。在达到 100,000 张照片后,我的业余技能开始显现,需要快速磨练。一些简单的查询需要 5-10 秒才能返回!
我有一个单一的文本框搜索功能,它将搜索“照片”表(用于标题和标题)、“人物”表、“关键字”表和“照片投稿人”表。 “人物”和“关键字”有两个关系/关联表,分别称为“photoPeople”和“photoKeyword”。
一种可能的用户搜索可能是: “Brad Pitt Angelina Jolie Sunglasses @MG” - 这应该返回包含 Brad 和 Angelina 的所有照片,供者@MG 可以看到和拍摄太阳镜。
我很快意识到我不能在“照片”表中的“标题”和“标题”字段上使用 INDEX,因为我正在使用带有“%”前缀的“LIKE”子句,并且那些特定的字段设置为“LONGTEXT”数据类型。因为我在这些字段上没有索引,所以它会导致巨大的返回时间。因此,我认为我需要使用“FULLTEXT”搜索,然后我可以将“标题”和“标题”字段设置为 VARCHAR(2000),因为迄今为止最大的标题是 1991 个字符,并且仍然使用“索引”功能,这有望加快速度。我也喜欢从搜索中删除单词的布尔函数。
我写这个问题的原因是我对“JOINS”完全没用。我可能可以在一个表上编写“FULLTEXT”查询,并且我可能可以使用左连接或右连接将两个表连接在一起......但因为我在它们之间有关联/关系表,我真的非常非常困惑。
如果有人可以向我展示一个示例查询,使用连接和全文并使用关系表,或者只是向我解释要使用的连接(如果有的话)以及您对全文的任何提示,我将不胜感激我拥有的数据库结构。
以下是我的基本数据库架构:
照片(待定) photoID INT(11) 主自动增量 标题长文本 标题长文本 日期创建日期时间 人(待定) peopleID INT(11) 主自动增量 人 VarChar(255) 照片人物 (tbl) 照片ID INT(11) peopleID INT(11) 关键字(tbl) keywordID INT(11) 主自动增量 关键字 VarChar(255) 照片关键字(待定) 照片ID INT(11) 关键字 ID INT(11) 照片贡献者(待定) 照片ID INT(11) 贡献者参考 VarChar(100)进行搜索时,查询的表/字段为: photos.headline、photos.caption、keywords.keyword、people.people、photoContributor.contributorRef.
我希望有人可以帮助我构建这个紧急查询。
【问题讨论】:
-
全文索引仅适用于 MyISAM 表。 InnoDB 从来没有(以及事情的发展方式,可能永远不会)支持它们。
-
我的表正在使用 MyISAM 引擎,这对我的事业有帮助吗..?
标签: mysql database indexing full-text-search