Как правильно сравнить NodeJS и PHP с производительностью запросов MySQL - PullRequest
1 голос
/ 19 марта 2012

Поскольку я не доверяю многим тестам, потому что они на самом деле не обрабатывают ввод-вывод, как соединения с базой данных, просто отправляют пользователю «Hello World» и получают огромные пропускные способности. Я не строю масштабируемых вещей в данный момент, но планирую сделать в ближайшее время. Мне нужны лучшие результаты, и я должен быть максимально реалистичным.

Я выполняю следующий запрос в обоих сценариях: «SELECT * FROM table», который возвращает 200 запросов. Результаты выборки:

(оба сервера MySQL, NodeJS и 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 помогает, если я не перезагружаю серверы.

Код, который я использовал для оценки: 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

$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);
?>

Я знаю, что есть и другие подходы, такие как Redis и Memcached, для повышения производительности, но меня интересует сырая производительность MySQL.

1 Ответ

1 голос
/ 21 марта 2012

Я бы рекомендовал вставку поверх любого вида выделения - первое не может быть кэшировано по своей природе, в то время как второе требует дополнительных усилий, чтобы предотвратить то же самое.

Также стоит рассчитать супер-простой запрос SELECT.Замените «phoneinfo» любой доступной вам таблицей;

ВЫБЕРИТЕ COUNT (anyFieldName) ОТ phoneinfo WHERE 1 = -1;

Если вы запустите обе из них, и войдите в хронометраж от 100+Быстрая загрузка страниц, тогда вы должны лучше понять, что это за сравнение.

...