mysql - 根据关键字过滤列表,包括列表和关键字> 2000万条记录(慢)

时间:2010-04-30 03:24:42

标签: mysql

我有两张桌子,两张记录都超过2000万张; table1是术语列表,table2是可能会或可能不会出现在这些术语中的关键字列表。我需要确定包含关键字的术语 'term'字段是VARCHAR(320),'keyword'字段是VARCHAR(64)。

我目前的策略是:

SELECT table1.term, table2.keyword FROM table1 INNER JOIN table2 ON table1.term 
LIKE CONCAT('%', table2.keyword, '%');

这不起作用,需要付费。
它不是服务器,是afaict(见注释)。

我怎么能重写这个以便它在一天之内运行?

我已经接受了内存表,或者更改为innodb并使缓冲池足够大以容纳两个表。不幸的是,每个mysql线程绑定到一个cpu,但我有4个核心(好吧,“8”与超线程);如果我可以分配工作量,那就太棒了。

注意:

  1. 关于服务器优化:两个表都是myisam,在匹配字段上有唯一索引; myisam密钥缓冲区大于两个索引文件大小的总和,甚至没有完全征税(key_blocks_unused是...大);该服务器是一个2x双核至强2U野兽,具有快速sas驱动器和8G ram,针对mysql工作负载进行了调整。

  2. 我记得我只索引'term'字段的前80个字符(以节省磁盘空间);不确定这是否有害或有帮助。

  3. MySQL 5.0.32,Debian Lenny x86_64

2 个答案:

答案 0 :(得分:1)

首先,您应该规范化您的架构:您应该制作第3个表格,以terms的方式保持keywordsterm_id <-> keyword_id之间的关系,而不是像现在这样做 - 在char中由空格分隔的字段

答案 1 :(得分:1)

您想要设置全文索引,然后对其进行搜索。现在,您的唯一索引可能根本没有帮助搜索(因为搜索中的前导'%')。

这意味着,对于table2中的每个项目,它几乎肯定会对table1进行全面扫描。称这种效率非常低效的做法很好。构建全文索引有点慢(虽然可能比你现在正在做的更快)但是一旦完成,搜索应该更快地批次

关于使用什么来进行全文索引:虽然MySQL具有内置的全文索引功能,但我怀疑它对你有多大帮助 - 拥有2000万行,其性能相当差(至少根据我的经验)。 Sphinx需要设置一些工作,但更有可能为您提供足够的性能。

相关问题