2012-03-19 8 views
1

実際にデータベース接続のようなI/Oを処理していないため、ユーザーに "Hello World"を送信して膨大なスループットを受け取るため、ベンチマークが信頼できません。私は現時点ではスケーラブルなものを作っていませんが、すぐにやろうとしています。私はより良い結果が必要であり、可能な限り現実的であることを確認します。NodeJSとPHPをMySQLクエリのパフォーマンスと適切に比較する方法

両方のスクリプトで次のクエリを実行します。「SELECT * FROM table」は200個のクエリを返します。サンプルの結果は以下のとおりです。

(MySQLの、NodeJS ANDA Apacheサーバは、各テストの前に再起動されている両方)

1000 requests, 100 concurrency: Apache: 564.20 req/s NodeJS: 102.61 req/s 
1000 requests, 200 concurrency: Apache: 393.75 req/s NodeJS: 105.12 req/s 
1000 requests, 400 concurrency: Apache: 42.75 req/s NodeJS: 105.07 req/s 
1000 requests, 1000 concurrency Apache: 16.5 req/s  NodeJS: 119.53 req/s 

クエリは常に同じなのでしかし、私はそうではありませんこれは、これらの結果を信用していませんリアルタイムアプリケーションで使用できます。両方のスイートを自分でテストするにはどうすればいいですか?ランダムな挿入やランダムな選択へのSQLクエリの変更は役に立ちますか?私がサーバを再起動しないと、PHP-MySQLの場合のキャッシングが役立ちます。

私はbencmarkするために使用されるコード: NodeJS:

var mysql = require("mysql"); 
var os = require('os'); 
var MySQLPool = require("mysql-pool").MySQLPool; 
var client = new MySQLPool({ 
    poolSize: 40, 
    user:  'root', 
    password: '123', 
    database: 'test' 
}); 

var express = require('express'), routes = require('./routes'); 
var app = module.exports = express.createServer(); 

app.get('/tables', function(req,res){ 
    client.query(
     'SELECT * FROM sample s', 
     function selectCb(err, results, fields) { 
     if (err) { 
      throw err; 
     } 
     res.send(results); 
     } 
    ); 
}); 

var cluster = require("cluster"); 
if (cluster.isMaster) { 
    for (var i = 0; i < os.cpus().length * 2; i++) { 
     var worker = cluster.fork(); 
    } 
} else { 
    app.listen(3000); 
} 

PHP私は、パフォーマンスを向上させるためのRedisとMemcachedのような他のアプローチがある知っている

$host = "localhost"; 
$username = "root"; 
$password = "123"; 
$db_name = "test"; 

$db=mysql_connect($host, $username, $password) or die('Could not connect'); 
mysql_select_db($db_name, $db) or die('no db'); 
$sth = mysql_query("SELECT * FROM sample s"); 
$rows = array(); 
while($r = mysql_fetch_assoc($sth)) { 
    $rows[] = $r; 
} 
echo json_encode($rows); 
?> 

が、私生のMySQLのパフォーマンスに興味があります。

答えて

1

私は任意の種類の選択に挿入することをお勧めします。前者は本質的にキャッシュできませんが、後者は同じことを防ぐために余分な努力をします。

スーパーシンプルなSELECTクエリのタイミングを取る価値もあります。 "phoneinfo"を使用可能なテーブルに置き換えます。

SELECT COUNT(anyFieldName)FROM phoneinfo WHERE 1 = -1;

これらの両方を実行し、100回以上の急速なページロードからタイミングを記録すると、比較の内容がはるかによくわかります。

関連する問題