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
一些可能有用的其他信息.关键字可以包含多个单词,例如:
永远不要使用以"%"开头的LIKE匹配大数据集 - 它不能在该字段上使用表索引并进行表扫描.这是你的缓慢来源.
可以使用索引的唯一匹配是以硬编码字符串开头的匹配(例如keyword LIKE '{term} %').
要解决此问题,请创建一个新的索引表(不要与数据库的表索引混淆)将单个术语映射到包含这些术语的关键字字符串; 然后你keyword LIKE '% {term} %'变成了t1.keyword = index_table.keyword and index_table.term="{term}".