介绍
DSPAM是为多用户企业系统设计的可扩展和基于开源的基于内容的垃圾邮件过滤器。 很好的过滤垃圾邮件,但是在繁忙的邮件服务器上,MySQL数据库的修剪过程太长了...
通过向数据库添加索引并在修剪时正确使用索引,可以大大优化DSPAM提供的默认purge-4.1.sql脚本。
让我们从dspam_token_data表中添加一些索引开始。 正确添加INDEX和使用索引,可以非常快速地查询这些命名空间。
DSPAM提供的默认脚本和表结构会导致全表扫描,因为数据未被索引或索引未正确使用。
添加索引
首先我们需要在表中添加一些索引。 索引允许我们更快地查询数据库,因为我们不必进行全表扫描。 (我们目前的DSPAM数据库的大小为8.5G,全表扫描字面上将整个邮件服务器保持静止。)
连接到数据库服务器并发出以下命令:
mysql> alter table dspam_token_data add index(spam_hits);
mysql> alter table dspam_token_data add index(innocent_hits);
mysql> alter table dspam_token_data add index(last_hit);
这将为spam_hits , innocent_hits和last_hit列添加索引。
dspam_signature_data表已经被正确编入索引 - 但是清理旧数据时索引没有被正确使用(更多关于这一点)。
DSPAM提供的脚本的有趣部分如下:
从dspam_token_data删除
where(innocent_hits * 2)+ spam_hits <5
和@ a-to_days(last_hit)> 60;
此查询不使用last_hit列上的索引,因为我们在该字段上调用了to_days函数,从而失去了使用该索引的能力。
还要注意,这里使用innocent_hits和spam_hits上的额外添加索引。 将查询更改为:
从dspam_token_data删除
where(innocent_hits * 2)+ spam_hits <5
和from_days(@ a-60)> last_hit;
下一个查询:
从dspam_token_data删除
innocent_hits = 1,spam_hits = 0
和@ a-to_days(last_hit)> 15;
同样的问题 - 将其更改为:
从dspam_token_data删除
innocent_hits = 1,spam_hits = 0
和from_days(@ a-15)> last_hit;
下一个查询:
从dspam_token_data删除
innocent_hits = 0和spam_hits = 1
和@ a-to_days(last_hit)> 15;
更改为:
从dspam_token_data删除
innocent_hits = 0和spam_hits = 1
和from_days(@ a-15)> last_hit;
下一个查询:
从dspam_token_data删除
使用
dspam_token_data LEFT JOIN dspam_preferences
ON dspam_token_data.uid = dspam_preferences.uid
AND dspam_preferences.preference ='trainingMode'
AND(“TOE”,“TUM”,“NOTRAIN”)中的dspam_preferences.value
WHERE @ a-to_days(dspam_token_data.last_hit)> 90
AND dspam_preferences.uid IS NULL;
更改为:
从dspam_token_data删除
使用
dspam_token_data LEFT JOIN dspam_preferences
ON dspam_token_data.uid = dspam_preferences.uid
AND dspam_preferences.preference ='trainingMode'
AND(“TOE”,“TUM”,“NOTRAIN”)中的dspam_preferences.value
WHERE from_days(@ a-90)> dspam_token_data.last_hit
AND dspam_preferences.uid IS NULL;
下一个查询:
从dspam_token_data删除
使用
dspam_token_data LEFT JOIN dspam_preferences
ON dspam_token_data.uid = dspam_preferences.uid
AND dspam_preferences.preference ='trainingMode'
AND dspam_preferences.value ='TUM'
WHERE @ a-to_days(dspam_token_data.last_hit)> 90
AND innocent_hits + spam_hits <50
AND dspam_preferences.uid IS NOT NULL;
更改为:
从dspam_token_data删除
使用
dspam_token_data LEFT JOIN dspam_preferences
ON dspam_token_data.uid = dspam_preferences.uid
AND dspam_preferences.preference ='trainingMode'
AND dspam_preferences.value ='TUM'
WHERE from_days(@ a-90)> dspam_token_data.last_hit
AND innocent_hits + spam_hits <50
AND dspam_preferences.uid IS NOT NULL;
最后:
从dspam_signature_data删除
@ a-14> to_days(created_on);
应改为:
从dspam_signature_data删除
where_days(@ a-14)> created_on;
Testrun与修改的修剪脚本
变更有帮助吗? 是! 以下是旧的未修改脚本和新修改脚本的时间:
真实2m57.726s
用户0m0.010s
sys 0m0.000s
而对于新修改的脚本(在同一数据集中使用):
真正的0m1.794s
用户0m0.000s
sys 0m0.000s
脚本使用默认的DSPAM脚本差不多3分钟,使用改变的脚本和索引不到2秒。
利弊
在表中添加索引时,可以为数据使用更多的磁盘空间。 如果您在修剪数据时需要执行性能,并且可以使用额外的磁盘空间,则可以按照上述说明添加索引并更改修剪脚本。 如果您的数据库中只有少量数据,并且性能不是问题,请遵守默认的DSPAM脚本。
链接
反馈
所有的反馈意见 - 请随时通过电子邮件与我联系:laursen [at] netgroup.dk