MySQL全文搜索和连接

时间:2011-09-07 21:07:27

标签: mysql database indexing full-text-search

我建了一个名人照片网站。在达到100,000张照片之后,我的业余技能开始显现,需要快速进行珩磨。一些简单的查询需要5-10秒才能返回!

我有一个文本框搜索功能,可以搜索“照片”表(标题和标题),“人物”表,“关键字”表和“photoContributor”表。 “people”和“关键字”有两个关系/关联表,称为“photoPeople”和“photoKeyword”。

可能的一个用户搜索: “布拉德皮特安吉丽娜朱莉太阳镜@MG” - 这应该归还所有包含布拉德和安吉丽娜的照片,其中太阳镜可以由贡献者@MG看到和拍摄。

我很快意识到我无法在“照片”表格中的“标题”和“标题”字段上使用INDEX,因为我使用带有“%”前缀的“LIKE”子句,并且那些特定的字段设置为“LONGTEXT”数据类型。因为我在这些字段上没有索引,所以它会导致巨大的返回时间。因此,我相信我需要使用“FULLTEXT”搜索,然后我可以将“标题”和“标题”字段设置为VARCHAR(2000),因为迄今为止最大的标题是1991个字符,仍然使用“INDEX”功能,这将有望加快速度。我也喜欢布尔函数来从搜索中删除单词。

我写这个问题的原因是,我在“JOINS”中完全没用。我可以在一个表上写一个“FULLTEXT”查询,我可以使用左或右连接将两个表连接在一起......但是因为我之间有关联/关系表,所以我真的很困惑。

如果有人可以请给我一个示例查询,使用连接和全文以及使用关系表,或者只是向我解释要使用的连接,如果有的话,以及您对全文的任何提示,我将不胜感激。我拥有的数据库结构。

以下是我的基本数据库架构:

photos (tbl)
photoID             INT(11)         Primary     Auto-Increment
headline            Long-Text
caption             Long-Text
dateCreated         DateTime

people (tbl)
peopleID            INT(11)         Primary     Auto-Increment
people              VarChar(255)

photoPeople (tbl)
photoID             INT(11)
peopleID            INT(11)

keywords (tbl)
keywordID           INT(11)         Primary     Auto-Increment
keyword             VarChar(255)

photoKeyword (tbl)
photoID             INT(11)
keywordID           INT(11)

photoContributor (tbl)
photoID             INT(11)
contributorRef      VarChar(100)

进行搜索时,查询的表/字段为: photos.headline,photos.caption,keywords.keyword,people.people,photoContributor.contributorRef。

我希望有人可以帮助我构建紧急查询。

1 个答案:

答案 0 :(得分:2)

同时具有全文搜索和外键约束(对连接有利)是MySQL的麻烦,因为它们分别仅由MyISAM和InnoDB引擎支持。

为了进行全文搜索,您必须拥有MyIsam引擎的表。我没有那么多经验,所以我无法帮助你。

你猜对了的时间是,你使用的是%前缀,强迫数据库在返回之前查看表中的每个该死的条目。

如果要使用连接,则必须在轮询数据库之前拆分查询字符串,但这应该相当容易。 可以在W3school教程中找到对连接的良好介绍。 http://www.w3schools.com/sql/default.asp

我可以看到你遇到的主要问题是: 即使你设法在数据库中实现了一些不错的连接,你仍然需要在连接表上使用like(因为你无法对InnoDB进行全文搜索)。因此,花哨的连接不会加快你的查询速度。

我的建议是这样的: 制作更多搜索字段。这样做可以使连接变得更好。 将人名拆分为First,mid姓,以避免使用Like。

如果你真的想保留一个文本字段搜索,你可能需要记下一些关于如何输入数据的约定(所以你可以在幕后和搜索中将它拆分),就像你正在使用贡献者的前缀一样。

对不起,我不能比这更准确,更有帮助,但是你提出的并不是一个快速解决问题,我很害怕。