【问题标题】:Fulltext vs id searching speed with MySQL使用 MySQL 的全文与 id 搜索速度
【发布时间】:2010-12-18 12:00:33
【问题描述】:

我有一个包含两个表的数据库:页面和标签的结构如下:

  • 页面:page_id、page_text、page_tags (任何时候大约 60000 条记录)
  • 标签:tag_id、tag_text
    (随时大约 300000 条记录)

每个页面都与许多标签相关联(使用 page_tags 列)。我的问题是关于 pages.page_tags 的,特别是,哪种方式存储上述关联最有效?

  1. 一种方法是全文索引 page.page_tags 并将相关标签的文本存储在那里,例如:apple orange fruit marmalade

  2. 第二种方法也是全文索引 page.page_tags 但存储相关标签的 ID,例如:132 14 24192 14

  3. 第三种方法是制作第三张表:tag_assoc,结构如下:

tag_assoc: page_id, tag_id

(对于页面中存在的每个标签,都会存在一条包含页面ID和标签的记录)


您认为哪种方法最有效? 尤其是:

  • A) 查询的搜索速度如下: “获取我每个有标签的页面: 苹果和橙子”
  • B) 更新表格。一个新的 页面可能到达数据库 经常。这意味着如果一个新的 在其中一些页面中找到标记 标签表中不存在的, 我必须在那里添加它。

如果没有,你有什么建议?

【问题讨论】:

  • 谢谢大家。两个答案都同样有帮助,所以我只能接受答案更快的那个

标签: mysql tags performance full-text-search text-processing


【解决方案1】:

如果你使用全文索引,我会这样做

表 1 - 页

pageid 
name
date
category
... etc etc other page meta data here

表 2 - page_fulltext

pageid
page_title_fulltext 
page_body_fulltext 

举个例子 第 1 页有 page_body_fulltext “懒狗的棕色狐狸快速跳跃” 第2页有page_body_fulltext“懒棕狗的红狐快跳”

进行全文搜索,您可以找到单个标签词,但也可以找到确切的字符串

你可以找到关键词“quick”或“brown”或“fox”

但如果有人搜索“quick brown fox”,您也可以这样做。

在您的示例中,您可能会查找所有 3 个单词并返回两个页面,这将是错误的。

mysql 在处理全文搜索方面也做得很好,你所建议的基本上是 mysql 自己可以做得很好的类似版本

所以在您上面概述的 2 个实例中 A)搜索速度会非常出色,因为 mysql 在本机上做得很好 B)我的方式更快,因为您不必检查您插入的每个关键字的存在。只需执行标准更新/插入,让 mysql 为您处理文本搜索的痛苦。

我的公司正在使用我描述的方法,并且效果很好......

另外,我将页面文本和页面标题放在单独的全文列中,您可以获得额外的好处,即标题包含关键字的页面比正文包含相同关键字的页面得分更高。

【讨论】:

    【解决方案2】:

    此页面虽然有点旧,但包含有关标记模式的各种方法以及每种方法如何影响性能的不错信息。您如何解决问题在很大程度上取决于您当前的记录数量以及您预计该数量未来会如何变化。

    架构: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html

    他们的表现: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2023-03-09
      • 2013-05-17
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多