I didn't notice this until we upgraded to 5.1 in anticipation of using 
partition tables, but I have a penpals query suggestion that took a 4 
hour SINGLE EMAIL LOOKUP to 90 seconds.

Currently using mysql 5.1.x , amavisd 2.5.4, innodb tables.
Having major delays on email with penpals enabled on sites with a large 
maddr table.
I never noticed this till we went to 5.1.  and I don't have any 5.0 or 
4.x installations available to test this on.

A query like this will take, sometimes several hours!!! (on a fast dual 
quad machine, scsi mirrored drives, lots of ram, swap fine)
if you want to try this inhouse, do a select * from maddr limit 50; and 
select a 'sid' from outside your domain, and a 'rid' from inside your 
domain.

SELECT msgs.time_num, msgs.mail_id, subject FROM msgs JOIN msgrcpt ON 
msgs.mail_id=msgrcpt.mail_id WHERE sid='16' AND rid='2' AND content!='V' 
AND ds='P' ORDER BY msgs.time_num DESC LIMIT 1

explain shows things like this:  (320K rows, 'Using where') and it takes 
4 hours to run!

explain SELECT msgs.time_num, msgs.mail_id, subject FROM msgs JOIN 
msgrcpt ON msgs.mail_id=msgrcpt.mail_id WHERE sid='16' AND rid='2' AND 
content!='V' AND ds='P' ORDER BY msgs.time_num DESC LIMIT 1;
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+
| id | select_type | table   | type  | 
possible_keys                       | key                 | key_len | 
ref               | rows   | Extra       |
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+
|  1 | SIMPLE      | msgs    | index | 
PRIMARY,msgs_idx_sid                | msgs_idx_time_num   | 4       | 
NULL              | 319783 | Using where |
|  1 | SIMPLE      | msgrcpt | ref   | 
msgrcpt_idx_mail_id,msgrcpt_idx_rid | msgrcpt_idx_mail_id | 14      | 
mail.msgs.mail_id |      1 | Using where |
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+
2 rows in set (0.01 sec)


I previously posted about this, and I suppose I didn't explain it well 
enough.

Three currious things make the query faster:. 
1) drop the ORDER BY  in 'ORDER BY msgs.time_num DESC LIMIT 1'
   this will probally not select the latest sent message, thereby 
breaking penpals.
2) drop the LIMIT 1.  I don't know if this will break penpals, Mark 
would need to tell us this
   (maybe 2.6.2 could eliminate the limit 1?  and penpals could just 
grab the first response?
3) force an index, as in
setting this in amavisd.conf:

$sql_clause{sel_penpals}="Select msgs.time_num, msgs.mail_id, subject 
FROM msgs force index (msgs_idx_sid) JOIN
msgrcpt ON msgs.mail_id=msgrcpt.mail_id WHERE sid=? AND rid=? AND 
content!='V' AND ds='P' ORDER BY msgs.time_num
LIMIT 1";

both EXPLAIN in mysql, and timed tests confirm that either of the three 
options takes a 4 HOUR QUERY into a 90 second query (yes, 90 seconds is 
way too long, and yes, the maddr table is too big, and, yes, mysql 5.1, 
amavisd 2.6 and partitions will help)

results:
original query,
original:  319783 rows, might be using msgs_idx_time_num key
tests,
1) no order by:  2018 rows, using  msgs_idx_sid key
either case, if forcing an index helps, should not this be a good 
edition to the default?
2) no limit 1: 2018 rows, using msgs_idx_sid key
3) force index, 2018 rows.

documentation on explains:
original:  319783 rows, no key used, 'Using where'

explain SELECT msgs.time_num, msgs.mail_id, subject FROM msgs JOIN 
msgrcpt ON msgs.mail_id=msgrcpt.mail_id WHERE sid='16' AND rid='2' AND 
content!='V' AND ds='P' ORDER BY msgs.time_num DESC LIMIT 1;
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+
| id | select_type | table   | type  | 
possible_keys                       | key                 | key_len | 
ref               | rows   | Extra       |
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+
|  1 | SIMPLE      | msgs    | index | 
PRIMARY,msgs_idx_sid                | msgs_idx_time_num   | 4       | 
NULL              | 319783 | Using where |
|  1 | SIMPLE      | msgrcpt | ref   | 
msgrcpt_idx_mail_id,msgrcpt_idx_rid | msgrcpt_idx_mail_id | 14      | 
mail.msgs.mail_id |      1 | Using where |
+----+-------------+---------+-------+-------------------------------------+---------------------+---------+-------------------+--------+-------------+

any of #1, 2 or 3 above:

explain SELECT msgs.time_num, msgs.mail_id, subject FROM msgs force 
index (msgs_idx_sid) JOIN msgrcpt ON msgs.mail_id=msgrcpt.mail_id WHERE 
sid='16' AND rid='2' AND content!='V' AND ds='P' ORDER BY msgs.time_num 
DESC LIMIT 1;
+----+-------------+---------+------+-------------------------------------+---------------------+---------+-------------------+------+-----------------------------+
| id | select_type | table   | type | 
possible_keys                       | key                 | key_len | 
ref               | rows | Extra                       |
+----+-------------+---------+------+-------------------------------------+---------------------+---------+-------------------+------+-----------------------------+
|  1 | SIMPLE      | msgs    | ref  | 
msgs_idx_sid                        | msgs_idx_sid        | 8       | 
const             | 2018 | Using where; Using filesort |
|  1 | SIMPLE      | msgrcpt | ref  | 
msgrcpt_idx_mail_id,msgrcpt_idx_rid | msgrcpt_idx_mail_id | 14      | 
mail.msgs.mail_id |    1 | Using where                 |
+----+-------------+---------+------+-------------------------------------+---------------------+---------+-------------------+------+-----------------------------+

table creates:
Table: msgs
Create Table: CREATE TABLE `msgs` (
  `mail_id` varbinary(12) NOT NULL,
  `secret_id` varbinary(12) DEFAULT '',
  `am_id` varchar(20) NOT NULL DEFAULT '',
  `time_num` int(10) unsigned NOT NULL DEFAULT '0',
  `time_iso` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
  `sid` bigint(20) unsigned NOT NULL,
  `policy` varchar(255) DEFAULT '',
  `client_addr` varchar(255) DEFAULT '',
  `size` int(10) unsigned NOT NULL DEFAULT '0',
  `content` binary(1) DEFAULT NULL,
  `quar_type` binary(1) DEFAULT NULL,
  `dsn_sent` char(1) DEFAULT NULL,
  `spam_level` float DEFAULT NULL,
  `message_id` varchar(255) DEFAULT '',
  `from_addr` varchar(255) DEFAULT '',
  `subject` varchar(255) DEFAULT '',
  `host` varchar(255) NOT NULL DEFAULT '',
  `quar_loc` varbinary(255) DEFAULT '',
  PRIMARY KEY (`mail_id`),
  KEY `msgs_idx_sid` (`sid`),
  KEY `msgs_idx_mess_id` (`message_id`),
  KEY `msgs_idx_time_num` (`time_num`),
  KEY `msgs_idx_reports` (`time_num`,`content`,`quar_loc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Table: msgrcpt
Create Table: CREATE TABLE `msgrcpt` (
  `mail_id` varbinary(12) NOT NULL,
  `rid` bigint(20) unsigned NOT NULL,
  `ds` char(1) NOT NULL DEFAULT '',
  `rs` binary(1) NOT NULL,
  `bl` char(1) DEFAULT '',
  `wl` char(1) DEFAULT '',
  `bspam_level` float DEFAULT NULL,
  `smtp_resp` varchar(255) DEFAULT '',
  KEY `msgrcpt_idx_mail_id` (`mail_id`),
  KEY `msgrcpt_idx_rid` (`rid`),
  KEY `idx_resp` (`smtp_resp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

-- 
Michael Scheidell, CTO
Phone: 561-999-5000, x 1259
 > *| *SECNAP Network Security Corporation

    * Certified SNORT Integrator
    * King of Spam Filters, SC Magazine 2008
    * Information Security Award 2008, Info Security Products Guide
    * CRN Magazine Top 40 Emerging Security Vendors

_________________________________________________________________________
This email has been scanned and certified safe by SpammerTrap(r). 
For Information please see http://www.spammertrap.com
_________________________________________________________________________

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
AMaViS-user mailing list
[email protected] 
https://lists.sourceforge.net/lists/listinfo/amavis-user 
 AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3 
 AMaViS-HowTos:http://www.amavis.org/howto/ 

Reply via email to