我建了一个名人照片网站。在达到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。
我希望有人可以帮助我构建紧急查询。
答案 0 :(得分:2)
同时具有全文搜索和外键约束(对连接有利)是MySQL的麻烦,因为它们分别仅由MyISAM和InnoDB引擎支持。
为了进行全文搜索,您必须拥有MyIsam引擎的表。我没有那么多经验,所以我无法帮助你。
你猜对了的时间是,你使用的是%前缀,强迫数据库在返回之前查看表中的每个该死的条目。
如果要使用连接,则必须在轮询数据库之前拆分查询字符串,但这应该相当容易。 可以在W3school教程中找到对连接的良好介绍。 http://www.w3schools.com/sql/default.asp
我可以看到你遇到的主要问题是: 即使你设法在数据库中实现了一些不错的连接,你仍然需要在连接表上使用like(因为你无法对InnoDB进行全文搜索)。因此,花哨的连接不会加快你的查询速度。
我的建议是这样的: 制作更多搜索字段。这样做可以使连接变得更好。 将人名拆分为First,mid姓,以避免使用Like。
如果你真的想保留一个文本字段搜索,你可能需要记下一些关于如何输入数据的约定(所以你可以在幕后和搜索中将它拆分),就像你正在使用贡献者的前缀一样。
对不起,我不能比这更准确,更有帮助,但是你提出的并不是一个快速解决问题,我很害怕。