[Greylist-users] Database performance
Wayne Walker
wwalker at bybent.com
Thu Jan 5 11:20:17 PST 2006
Attached this time.
On Thu, Jan 05, 2006 at 01:16:13PM -0600, Wayne Walker wrote:
> Brian,
>
> I did some experimenting. If instead of :
>
> REPLACE INTO relayreport SELECT * FROM relaytofrom;
> # which for me on 500,000 rows going into 2.5 M rows, takes 3.5 minutes
>
> We do a little more work:
>
> ONCE - create a table (temp_archive) idenitcal to relayreport, BUT with NO indexes
>
> Then in db_maintenance.pl we :
>
> INSERT INTO temp_archive SELECT * FROM relaytofrom;
> # which for me on 500,000 rows take 3.5 SECONDS
>
> REPLACE INTO relayreport SELECT * FROM temp_archive;
> DELETE FROM temp_archive;
>
> Then the whole process takes about 2% longer, But the relaytofrom table
> is only locked for 2% of said runtime instead of 100%.
>
> I've attached the experimental benchmarking I did.
>
> Wayne
--
Wayne Walker
www.unwiredbuyer.com - when you just can't be by the computer
wwalker at bybent.com Do you use Linux?!
http://www.bybent.com Get Counted! http://counter.li.org/
Perl - http://www.perl.org/ Perl User Groups - http://www.pm.org/
Jabber: wwalker at jabber.gnumber.com AIM: lwwalkerbybent
IRC: wwalker on freenode.net
-------------- next part --------------
Table type: MyISAM, Latin1
mysql> select count(*) from relaytofrom;
+----------+
| count(*) |
+----------+
| 515304 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from relayreport
-> ;
+----------+
| count(*) |
+----------+
| 2687720 |
+----------+
1 row in set (0.00 sec)
Ran replace twice to verify consistency (not quite valid since all the
rows are gauranteed dups, but normally most of them are.
mysql> replace into relayreport select * from relaytofrom;
Query OK, 782489 rows affected (2 min 40.34 sec)
Records: 515304 Duplicates: 267185 Warnings: 0
mysql> replace into relayreport select * from relaytofrom;
Query OK, 1030608 rows affected (3 min 42.45 sec)
Records: 515304 Duplicates: 515304 Warnings: 0
mysql> replace into relayreport select * from relaytofrom;
Query OK, 1030608 rows affected (3 min 37.48 sec)
Records: 515304 Duplicates: 515304 Warnings: 0
Definitely takes longer to overwrite than to insert, as expected
Now created a temp_archive table (from the table structure of
relaytofrom).
Will insert into it twice and replace into it twice (deleteing all
recordsin between.
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (28.82 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> delete * from temp_archive;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from temp_archive' at line 1
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.06 sec)
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (28.12 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql>
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.06 sec)
mysql> replace into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (28.07 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.07 sec)
mysql> replace into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (28.14 sec)
Records: 515304 Duplicates: 0 Warnings: 0
So, pushing from the temp table into the relayreport table is of course the same speed as above:
mysql> replace into relayreport select * from temp_archive;
Query OK, 1030608 rows affected (3 min 26.00 sec)
Records: 515304 Duplicates: 515304 Warnings: 0
I recreated the temp_archive table with no indexes (save the PRI key
for id) to see if it affected insert time. It certainly did. Down to 7
seconds! That's 30 times faster than the replace into a populated table.
So for the guy who is getting locked up for about 90 minutes, we should
drop that down to two minutes. By generating the temp_archive table and using insert into it (with no indexes).
Wow! cut insert time in half again removing the auto_increment and primary key from the temp_archive table!!!
mysql> CREATE TABLE `temp_archive` ... with only id auto_increment/primary
Query OK, 0 rows affected (0.01 sec)
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (7.03 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.05 sec)
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (6.85 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.05 sec)
mysql> replace into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (6.84 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> drop table temp_archive;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE `temp_archive` ... with no indexes
Query OK, 0 rows affected (0.01 sec)
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (3.56 sec)
Records: 515304 Duplicates: 0 Warnings: 0
mysql> delete from temp_archive;
Query OK, 515304 rows affected (0.04 sec)
mysql> insert into temp_archive select * from relaytofrom;
Query OK, 515304 rows affected (3.52 sec)
Records: 515304 Duplicates: 0 Warnings: 0
This won't change the total run time, but it will make a ~60X reduction in the time that the relaytofrom table is locked.
More information about the Greylist-users
mailing list