Задать вопрос

Как увеличить скорость mysql на node.js?

Здравствуйте.
Проблема со скоростью сохранения в mysql на node.js.
Установил следующее расширение - https://www.npmjs.org/package/mysql.
Имеется код:
var mysql = require('mysql'),
	post_term = {
		"name": 'test',
		"second_name": 'test',
		"third_name": 'test'
	},
	time = 0,
	start_time = 0;

var connection = mysql.createConnection({
	host     : '***',
	database : '***',
	user     : '***',
	password : '***'
});

start_time = Date.now();

connection.query('INSERT INTO terms SET ?', post_term, function(err, result){
	if(err)
		throw err;

	time = Date.now() - start_time;
	console.log('Time: '+time);
});


Время работы такого кода на моем ноутбуке составляет 370 миллисекунд.
Аналогичный код на php, отрабатывает за 0.000133283 миллисекунд.
<?php

	$link = mysql_connect($host, $user, $pass);
	if (!$link) {
	    die('Не удалось соединиться : ' . mysql_error());
	}

	$db_selected = mysql_select_db($db_name, $link);

	if (!$db_selected) {
	    die ('Не удалось выбрать базу: ' . mysql_error());
	}

	$start = microtime(true);

	$query = "INSERT INTO terms (name, second_name, third_name) VALUES ('test', 'test', 'test')";
	$result = mysql_query($query, $link);

	if (!$result) {
		die('Неверный запрос: ' . mysql_error());
	}

	echo number_format(microtime(true) - $start, 6);
?>


Что я делаю неправильно? Почему node работает настолько долго?

Верное время работы php скрипта - 138.12ms.
В расчетах возникла ошибка из-за того, что значения microtime(в php) брались в микросекундах, а не в секундах.
  • Вопрос задан
  • 2990 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
AMar4enko
@AMar4enko
Потому что читаем секцию "Establishing connection" документации пакета.
В вашем случае соединение будет установлено не в момент вызова createConnection, а в момент выполнения первого запроса, следовательно 370мс это не "чистое" время запроса.
В документации есть пример с принудительным коннектом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Кроме проблем, уже разобранных выше, для ускорения пригодится посмотреть, что такое mysql.createPool, пригодится для асинхронного исполнения конкурирующих запросов, чтобы они шли не через одно соединение и не толпились. Так же гляньте на модуль cluster, для многопоточного запуска ноды, если у Вас запросы к БД происходят во время HTTP запросов, то их можно распараллелить на несколько ядер, а по умолчанию все обрабатывается на одном ядре. Будет не лишним подумать по поводу кеширования результатов запросов в оперативной памяти, или вообще перейти от исполнения запросов к БД из HTTP-запросов, к их предварительному и отложенному исполнению. То есть, при старте забирайте как можно больше данных сразу в память (сейчас памяти много и она дешевая), на HTTP запросах делайте поиск по хешу вместо запроса к БД, а при изменениях, не делайте запрос сразу, а пишите изменение в специальную очередь и сохраняйте в БД в ленивом (lazy) режиме. Так ускоритесь на несколько порядков. Если данные не помещаются в память, то не используйте предварительное чтение, а делайте только отложенную запись. И еще может пригодиться моя либа, ну это уже для удобств, а не для скорости: https://www.npmjs.org/package/mysql-utilities Вообще, советую PgSQL или MongoDb, гораздо шустрее они и удобнее, сам уже не юзаю MySQL и рад этому.
Ответ написан
zoonman
@zoonman
⋆⋆⋆⋆⋆
Возможно, php устанавливает соединение на уровне сокетов, а нода лезет через весь стэк.
Попробуйте задать socketPath для соединения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы