[TYPO3-dev] Quick speed test mysql vs mysqli, for now a win for mysql
    ries van Twisk 
    typo3 at rvt.dds.nl
       
    Tue Oct  9 05:46:23 CEST 2007
    
    
  
Hey Guys,
today I did a very quick speedtest for mysql native and mysqli with  
prepared statements.
I filled a simpel table with 1000 records and each records has one  
test field with 1Kbye of random textual content.
THis is the table DDL (MyISAM):
CREATE TABLE `test` (
   `uid` int(11) NOT NULL auto_increment,
   `pid` int(11) NOT NULL,
   `text` text collate utf8_unicode_ci NOT NULL,
   PRIMARY KEY  (`uid`),
   KEY `pid` (`pid`)
) ;
This was how I filled the table
<?php
$connection = mysql_connect('localhost', 'root', '');
mysql_select_db('speedtest', $connection);
function Random_Password($length) {
     srand(microtime(true)*1000000);
     $possible_charactors =  
"abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     $string = "";
     while(strlen($string)<$length) {
         $string .= substr($possible_charactors, mt_rand(0, strlen 
($possible_charactors)),1);
     }
     return($string);
}
for ($i=0; $i<1000;$i++) {
	$str = "insert into test (pid, text) VALUES (".($i % 25).",'". 
(Random_Password(1024))."')";
	mysql_query($str, $connection);
}
mysql_close($connection);
?>
mysqli version
<?php
$mysqli = mysqli_connect('localhost', 'root', '', 'speedtest');
$stmt = $mysqli->prepare("SELECT * FROM test WHERE uid = ?");
for ($i=0; $i<100;$i++) {
	$stmt->bind_param("i", $rnd);
	$rnd = rand(0, 10) * 100;
	$stmt->execute();
	$stmt->bind_result($uid, $pid, $text);
	$stmt->fetch();	
}
mysqli_close($mysqli);
?>
mysql version
<?php
$connection = mysql_connect('localhost', 'root', '');
mysql_select_db('speedtest', $connection);
for ($i=0; $i<100;$i++) {
	$str = "SELECT * FROM test WHERE uid = " .rand(0, 10)*100;
	$res = mysql_query($str, $connection);	
	$row = mysql_fetch_assoc($res);
}
mysql_close($connection);
?>
The goal of using rnd(0, 10)*100 is to make sure the
records are cached using the mysql version and will mimic
a bit better what happens on the website, means only a part of the  
records
get's retrieved many times
As of the current state the mysql version is 5% faster
then the mysqli version with prepared statements using
the above code. This is properly because my version of mysql is 5.0.x
and prepared statements are not cached.
When I set my random string to rand(0, 50) * 20; the difference
is even bigger at 10% win for mysql (interesting, I don't know why yet)
If anybody is interested in my jmeter config then let me know
and I can send it over.
I hope that somebody can confirm and check my results (specially
the conform part :D )
I can publish the jMeter graphs somewhere upon request if you wish...
Ries
--
Ries van Twisk
Freelance TYPO3 Developer
email: ries at vantwisk.nl
web:   http://www.rvantwisk.nl/
skype: callto://r.vantwisk
Phone: + 1 810-476-4193
    
    
More information about the TYPO3-dev
mailing list