我正在使用一个相当大的数据库(500多万条目),并且正在尝试优化搜索引擎。
我的主要表格如下:
项 (id,mixed,value)
mixed包含与此项目相关的关键字(例如:“Jason Bourne很酷”)。我想要做的是填充两个新表:
item_terms (id,term)
item_term_results (id,item_terms_id,items_id)
来自主表项目。我已经编写了一个MySQL程序,循环遍历此主表中的所有结果,遵循以下算法:
问题是,该过程需要方式处理太多时间。有了那么多数据,这个程序需要150天才能完成,即使我们的服务器非常强大,这也太过分了。
知道如何做到这一点?我们基本上这样做是为了使搜索比简单的更快,因为item_terms.item中的值将是唯一的。
谢谢
答案 0 :(得分:1)
据推测,您已经完成了研究,以确定您的不同术语数量(例如" Jason"," Bourne"," cool"的大小合理受限,即使你有一个大项目表。
据推测,您还确定MySQL的FULLTEXT搜索功能不适合您的应用程序。如果你还没有调查过FULLTEXT搜索,我强烈建议你这样做。这可能是完美的事情。
您的item_term_results表不需要也不应该有单独的id
列。使主键成为其他两列的组合,并按照(item_terms_id, itemid)
我建议您弄清楚如何脱机处理批量索引,即与数据库断开连接。这是我的建议:
id
,然后是一个标签mixed
item_terms_id
,而不是在数据库中。item_id
然后选项卡然后item_terms_id
。item_terms_id
然后选项卡的形式将term
的文本写入另一个文本文件中的每个字词。这应该可以消除逐行插入的严重开销。对于半个gigarecord,它将使用大量RAM用于内存中item_terms
哈希,并且它可能运行数小时,但不是很多天。
然而,再次,在你咬这个大子弹之前调查FULLTEXT。它的构建是为了做你正在做的事情。