【问题标题】:MySQL Full Text Search and JoinsMySQL 全文搜索和连接
【发布时间】: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


【解决方案1】:

同时拥有全文搜索和外键约束(这对连接很有用)对于 MySQL 来说是个麻烦,因为它们分别只被 MyISAM 和 InnoDB 引擎支持。

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

正如您所猜测的那样,时间消耗是您使用 like 和 % 前缀,迫使数据库在返回之前查看表中的每个该死的条目。

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

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

我的建议是: 制作更多搜索字段。这样做可以从连接中获得一些好处。 将人名拆分为 First, middle last name 以避免需要使用 Like。

如果您真的想保留一个文本字段搜索,您可能需要制定一些关于如何输入数据的约定(这样您就可以在幕后将其拆分并搜索),就像您使用贡献者前缀所做的那样。

很抱歉,我不能比这更准确和更有帮助,但恐怕你所呈现的不是一个快速修复的问题。

【讨论】:

  • 感谢您的快速回复。我同意这个问题需要时间才能完成。
  • 我刚刚检查过,我的表正在使用 MyISAM 引擎。我已经有一个高级搜索页面,用户可以在其中使用多个文本框,但似乎每个人都使用快速搜索框,但它没有目前运行得很好,因此需要一个新的查询。
  • 而且,只是我的标题和标题字段使用了“LIKE”。关键字、人员和贡献者字段都必须完全匹配,例如WHERE 关键字 = '太阳镜'
  • 我猜照片表是你数据库中最大的表之一。如果是这样,使用两个“喜欢”查询是毁灭性的。我几乎可以保证这就是正在扼杀您的搜索时间的原因。就像使用 % 前缀一样,从左到右检查整个字符串是否匹配,这意味着疯狂的搜索时间。将其乘以 2 并再次乘以表中的行数,你就得到了地狱。如果将这两个“喜欢”变成全文搜索,我几乎可以肯定你根本不需要担心连接......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多