从单表性能问题创建多对多

时间:2014-07-28 18:00:35

标签: mysql performance search insert procedure

我正在使用一个相当大的数据库(500多万条目),并且正在尝试优化搜索引擎。

我的主要表格如下:

(id,mixed,value)

mixed包含与此项目相关的关键字(例如:“Jason Bourne很酷”)。我想要做的是填充两个新表:

item_terms (id,term)

item_term_results (id,item_terms_id,items_id)

来自主表项目。我已经编写了一个MySQL程序,循环遍历此主表中的所有结果,遵循以下算法:

  • 拆分items.mixed
    • 遍历我们获得的值:
      • 在item_terms
      • 中插入值
      • 在item_term_results中插入一个新结果,将items.id放入item_term_results中的item_term_results.items_id和last_inserted_id()

问题是,该过程需要方式处理太多时间。有了那么多数据,这个程序需要150天才能完成,即使我们的服务器非常强大,这也太过分了。

知道如何做到这一点?我们基本上这样做是为了使搜索比简单的更快,因为item_terms.item中的值将是唯一的。

谢谢

1 个答案:

答案 0 :(得分:1)

据推测,您已经完成了研究,以确定您的不同术语数量(例如" Jason"," Bourne"," cool"的大小合理受限,即使你有一个大项目表。

据推测,您还确定MySQL的FULLTEXT搜索功能不适合您的应用程序。如果你还没有调查过FULLTEXT搜索,我强烈建议你这样做。这可能是完美的事情。

您的item_term_results表不需要也不应该有单独的id列。使主键成为其他两列的组合,并按照(item_terms_id, itemid)

的顺序将它们放入键中

我建议您弄清楚如何脱机处理批量索引,即与数据库断开连接。这是我的建议:

  1. 转储一个简单但很大的文本文件,其中每行包含id,然后是一个标签mixed
  2. 编写执行以下操作的程序。
    1. 阅读表格的每一行。
    2. 将该行拆分为单独的项目
    3. 将每个项目插入到内存中的哈希映射中,对其进行重复数据删除并在内存中为其提供唯一的item_terms_id,而不是在数据库中。
    4. 为每个项目写一行到文本文件item_id然后选项卡然后item_terms_id
  3. 处理完输入文件中的所有行后,请以item_terms_id然后选项卡的形式将term的文本写入另一个文本文件中的每个字词。
  4. 最后,使用LOAD DATA INFILE将这两个文件批量导入MySQL。
  5. 这应该可以消除逐行插入的严重开销。对于半个gigarecord,它将使用大量RAM用于内存中item_terms哈希,并且它可能运行数小时,但不是很多天。

    然而,再次,在你咬这个大子弹之前调查FULLTEXT。它的构建是为了做你正在做的事情。