针对大型数据集的流程优化

Chu*_*ess 2 php sql oracle optimization perl

我目前有一个项目,我们正在为PPC广告处理3000万+关键字.我们在Oracle中维护这些列表.有时我们需要从列表中删除某些关键字.该流程包括各种匹配类型策略,以确定是否应删除关键字:

  • 确切:WHERE keyword = '{term}'
  • 包含:WHERE keyword LIKE '%{term}%'
  • 忘记:WHERE keyword LIKE '% {term} %' OR keyword LIKE '{term} %' OR keyword LIKE '% {term}'

现在,当处理列表时,它只能使用上面列出的匹配类型之一.但是,必须扫描所有30mil +关键字以进行匹配,并返回匹配的结果.目前,此过程可能需要数小时/天才能处理,具体取决于要搜索的关键字列表中的关键字数量.

您对如何优化流程有任何建议吗?这样可以更快地运行吗?

更新: 以下是搜索Holiday Inn的示例查询:

SELECT * FROM keyword_list 
WHERE
(
lower(text) LIKE 'holiday inn' OR
lower(text) LIKE '% holiday inn %' OR
lower(text) LIKE 'holiday inn %'
);
Run Code Online (Sandbox Code Playgroud)

这是EXPLAIN输出的pastebin:http://pastebin.com/tk74uhP4

一些可能有用的其他信息.关键字可以包含多个单词,例如:

  • 这是一个示例关键字
  • 我喜欢我的关键词
  • 关键字很棒

DVK*_*DVK 5

永远不要使用以"%"开头的LIKE匹配大数据集 - 它不能在该字段上使用表索引并进行表扫描.这是你的缓慢来源.

可以使用索引的唯一匹配是以硬编码字符串开头的匹配(例如keyword LIKE '{term} %').

要解决此问题,请创建一个新的索引表(不要与数据库的表索引混淆)将单个术语映射到包含这些术语的关键字字符串; 然后你keyword LIKE '% {term} %'变成了t1.keyword = index_table.keyword and index_table.term="{term}".