- PHP
- MySQL
- продуктивність
- Node.js
- Веб розробка
Є веб-система (php + mysql на xampp), в локальній мережі. В системі пара сотень користувачів. В системі дуже швидко росте кількість записів в БД. Разом з цим збільшуються гальма і збільшується навантаження на ЦП сервера. Я почав копати в пошуках вузького місця. Всю дооолго ланцюжок копаній наводити не буду. В результаті копаній дійшов ось до чого:
Поставив xampp собі на ПК (core i7, 8Gb RAM, Win7 Ultimate). Поставив node.js server собі на ПК.
Роблю з PHP звернення до БД mysql.
У таблиці dreg_document 5000 записів. Я вибираю їх в циклі 1000 разів. Цей код відпрацьовує за 3.5 сек.
(PDO використовувати не можна з певних причин, тому такий код).
Роблю те ж саме звернення з сервера node.js
АЛЕ! Ітерацій в 100 разів більше. Цей код відпрацьовує 1.4 сек.
Далі. З браузера відкриваю websocket з'єднання і прошу node.js сервер виконати скрипт показаний вище. Реалізація клієнта (браузер файерфокс):
Цей код відпрацьовує 2 сек. Тобто відповідь від сервака в браузер приходить через 2 секунди. (І це все при тих же 100 тисячах ітерацій)
У node.js використовую наступні модулі:
Питання: чи дійсно драйвер м'яз для Ноди в 150 (!) Разів спритніше PHP-шного? Або я не правильно тестую? Якщо останнє, підкажіть, як правильно тестувати.
Мені самому важко повірити що node.js з драйвером, написаним кілька років тому в сотні разів швидше php, на якому стільки народу сидить, і який постійно оновлюється і т.п.
P.S. PDO протесту. ще повільніше
З.И. 2
Протести ще. Неповеріл. На 1000 ітереацій:
mysql_ * за 3.4 сек
PDO за 6.67 сек
mysqli за 6.68 сек.
Отже. Дякую за відповіді. Я зрозумів в чому справа. Оскільки програмую на node.js аж цілих 2 тижні, я невірно трактував результати. Змінив тест, і вийшло ось що:
Якщо думати по php-шному, після відпрацювання всіх запитів, відправляється повідомлення клієнту -
client.send ( 'qwerty');
Але на ділі, повідомлення відправляється тоді коли node-server відправить до БД ВСЕ запити. Потім (! Не чекаючи відповіді від БД) сервак відправляє клієнту повідомлення. Клієнт (браузер) підраховує час (вийшло, до прикладу 2 секунди для 100 000 ітерацій). А в цей час в ноду продовжують надходити відповіді від БД. Ці відповіді ми бачимо за допомогою
console.log (str);
І тут вже виходять зовсім інші результати.
Далі, змінюємо скрипт наступним чином, щоб підрахувати час виконання від 1го до останнього асинхронного підключення до БД:
результат
Для 100 ітерацій 2.5 сек (що в 15 разів повільніше ніж на PHP)
Проміжний відповідь на топік:
Node.js не швидше PHP в 150 раз в питанні доступу до БД.
Навпаки, Node.js в цьому плані в 15 разів повільніше ніж PHP.
(Це якщо брати обидва сервера "з коробки", без улучшательств і налаштувань)
Нове запитання:
Вірний мій останній тест? Або я в ньому теж щось не так зробив?
Для того щоб отримати те що ви по-ідеї хочете отримати, код повинен бути приблизно такий:
/ * BEGIN OF NODE CODE * /
var ITERATIONS = 1000;
var async = require ( 'async');
var mysql = require ( 'mysql');
var connection = mysql.createConnection (host. 'localhost',
user. 'Root',
password. 'Secret',
database. 'Test'
>);
console.time ( 'node.js');
async.times (ITERATIONS, function (n, next) connection.query ( "SELECT * FROM test", function (err, result) next (err, result);
>);
>, Function (err, results) if (err) throw new Error (err);
console.timeEnd ( 'node.js');
console.log ( 'results:', results.length);
connection.end ();
>);
/ * END OF NODE CODE * /
У мене 1000 запитів повернули 1000 результатів за 320 мілісекунд (MariaDB).
Перевірте на своїй базі мій варіант коду і повідомте який вийшов результат. Не забудьте поставити модуль async, який я вам дуже рекомендую, тому як судячи по циклах FOR в вашому коді ви про нього не знаєте.