Hi.
I've just set up my prototype so I can benchmark comparatively tthe profmance
between PostgreSQL and MySQL.
There's good news, and there's bad news.
The good news is - MySQL is faster by about 2 times.
The bad news is - MySQL is ONLY faster by about 2 times.
Now, I DO understand that this is a LOT, but I'd really like to make this go
faster.
Here is the setup I have used:
Number of Master records: 49,508
Number of FTI entries (PostgreSQL only): 1,574,136
Optimize/Vacuum ran just before the test:
PostgreSQL: VACUUM VERBOSE ANALYZE;
MySQL: OPTIMIZE TABLE Master
The data set used on the prototype benchmark is a random set of old job
adverts that I had lying around from a previous project.
On PostgreSQL a custom subrouting was written to handle the FTI text
splitting.
Query used on PostgreSQL:
SELECT DISTINCT Jobs.*
FROM Jobs,
JobsFTI
WHERE Retrieved > '08-Nov-2000' AND
Retrieved < '10-Nov-2000 AND
Jobs.ID = JobsFTI.ID AND
(
JobsFTI.String = 'perl' OR
JobsFTI.String = 'linux' OR
JobsFTI.String = 'apache' OR
JobsFTI.String = 'html' OR
JobsFTI.String = 'cgi' OR
JobsFTI.String = 'mod_perl' OR
JobsFTI.String = 'modperl' OR
JobsFTI.String = 'postgres' OR
JobsFTI.String = 'nt' OR
JobsFTI.String = 'postgresql'
);
Query used on MySQL:
SELECT Jobs.*
FROM Jobs
WHERE Retrieved > '20001108' AND
Retrieved < '20001110 AND
MATCH (Title, Description)
AGAINST ('perl linux apache html cgi mod_perl modperl postgres postgresql
nt');
The test machine is a dual P3/1GHz with 1 GB of RAM. In the test, a perl
program using DBI executed the above queries 100 times. The test was ran
twice on each database, to avoid any influence of disk access on the
performance (i.e. it was all running from cache). The second value is
reported here.
Both PostgreSQL and MySQL were set to use 128 MB of buffer cache (key_buffer
in MySQL, shared_buffers in PostgreSQL), with a similar amount of sort memory
allowed.
Results:
PostgreSQL: 119 seconds. (1.19 seconds/query)
MySQL: 58 seconds. (0.58 seconds/query)
I must say I am impressed with the speed increase. In all honesty I expected
less of a difference.
I just tried reducing the query string to just 'perl linux', and now the time
taken is 9 seconds for the test (100 runs), compared to 15 seconds for
PostgreSQL. MySQL sits happily at about 16 MB memory consumption, while
PostgreSQL consumes about 130 MB. The reason for this is, apparently, because
PostgreSQL handles it's own caching (in addition to the OS).
The figure of 0.09 seconds/query is very nice for a reasonable sounding case
of two search parameters. With 35 search parameters MySQL reports 1.94
seconds search time, which is still impressive for such a large query.
Now for the punch-line question - how do I speed this up further? I need to
at least maintain this sort of performance on a signifficantly smaller server
than this benchmark test-bed. Are there any tuning parameters I should be
aware of? I have already gone through the documentation and applied
reasonable sounding values to variables. Is there some sort of query
"profiling" mechanism to try to see where things are taking longest?
I'm using MySQL v4.0-alpha BTW.
I will try recompiling with pgcc at some point with in-line functions, -O9,
and without frame pointers etc, but it is likely that this system will
eventually run on an AMD Athlon processor, so it may not work with pgcc. It
is also almost certain that the database server will be separate from the
application server, which is likely to slow things down further.
I have just done "strip" on the mysqld. No percievable difference in my
custom test.
I compiled it all without debug options.
I haven't compiled the server with -static.
I haven't tried starting the deamon with --skip-safemalloc. Is this likely to
make much difference/cause problems?
How much difference is compiling with pgcc with -O9, in-line functions, and
without frame pointers likely to make?
Are any of those tweaks deprecated in v4?
Or am I simply pushing against the limits of what is reasonably possible here?
Thanks for any input you can provide.
Regards.
Gordan
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php