Я был очень взволнован по поводу MongoDb и тестировал его в последнее время. У меня была таблица с именем posts в MySQL, и около 20 миллионов записей были проиндексированы только в поле с именем id.
Я хотел сравнить скорость с MongoDB, и я провел тест, который получит и распечатает 15 записей случайным образом из наших огромных баз данных. Я выполнял запрос около 1000 раз каждый для mysql и MongoDB, и я удивлен, что не замечаю большой разницы в скорости. Возможно MongoDB в 1,1 раза быстрее. Это очень разочаровывает. Есть ли что-то, что я делаю не так? Я знаю, что мои тесты не идеальны, но MySQL наравне с MongoDb, когда дело доходит до интенсивной работы по чтению.
Примечание:
- У меня есть два ядра + (2 потока) i7 CPU и 4 ГБ оперативной памяти
- У меня есть 20 разделов на MySQL каждый из 1 миллиона записей
Пример кода, используемого для тестирования MongoDB
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$m = new Mongo();
$db = $m->swalif;
$cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
?>
Пример кода для тестирования MySQL
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH . "classes/forumdb.php");
$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$db = new AQLDatabase();
$sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
$result = $db->executeSQL($sql);
while ($row = mysql_fetch_array($result) )
{
//echo $row["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000);
}
return $numbers;
}
?>
источник
Ответы:
MongoDB не магически быстрее. Если вы храните одни и те же данные, организованные в основном одинаковым образом, и получаете к ним одинаковый доступ, тогда вы не должны ожидать, что ваши результаты будут сильно отличаться. В конце концов, MySQL и MongoDB оба являются GPL, поэтому, если в Mongo был какой-то магически лучший код ввода-вывода, команда MySQL могла бы просто включить его в свою кодовую базу.
Люди видят производительность MongoDB в реальном мире в основном потому, что MongoDB позволяет вам делать запросы другим способом, который более чувствителен к вашей рабочей нагрузке.
Например, рассмотрим дизайн, который сохранил много информации о сложном объекте в нормализованном порядке. Это может легко использовать десятки таблиц в MySQL (или любой реляционной базе данных) для хранения данных в нормальной форме со многими индексами, необходимыми для обеспечения реляционной целостности между таблицами.
Теперь рассмотрим тот же дизайн с хранилищем документов. Если все эти связанные таблицы подчинены основной таблице (а они часто бывают), вы можете смоделировать данные таким образом, чтобы вся сущность сохранялась в одном документе. В MongoDB вы можете хранить это как один документ, в одной коллекции. Именно здесь MongoDB начинает обеспечивать превосходную производительность.
В MongoDB, чтобы получить всю сущность, вы должны выполнить:
Итак, поиск b-дерева и чтение двоичной страницы. Log (n) + 1 IO. Если индексы могут постоянно находиться в памяти, то 1 IO.
В MySQL с 20 таблицами вы должны выполнить:
Таким образом, общая сумма для mysql, даже если предположить, что все индексы находятся в памяти (что сложнее, поскольку их в 20 раз больше), составляет около 20 поисков по диапазонам.
Эти поиски диапазона, вероятно, состоят из случайного ввода-вывода - разные таблицы определенно будут находиться в разных местах на диске, и возможно, что разные строки в одном и том же диапазоне в одной и той же таблице для объекта могут быть не смежными (в зависимости от того, как объект был обновляется и т. д.).
Таким образом, для этого примера итоговый подсчет примерно в 20 раз больше ввода-вывода с MySQL на логический доступ по сравнению с MongoDB.
Именно так MongoDB может повысить производительность в некоторых случаях .
источник
Есть ли у вас параллелизм, то есть одновременные пользователи? Если вы просто выполните 1000 раз подряд запрос с одним потоком, разницы почти не будет. Слишком просто для этих двигателей :)
НО я настоятельно рекомендую вам создать настоящий сеанс нагрузочного тестирования, что означает использование инжектора, такого как JMeter, с 10, 20 или 50 пользователями ОДНОВРЕМЕННО, чтобы вы могли реально увидеть разницу (попробуйте встроить этот код в веб-страницу JMeter можно запросить).
Я только что сделал это сегодня на одном сервере (и простой коллекции / таблице), и результаты довольно интересны и удивительны (MongoDb был действительно быстрее при записи и чтении, по сравнению с движком MyISAM и движком InnoDb).
Это действительно должно быть частью вашего теста: параллелизм и движок MySQL. Кроме того, требования к дизайну данных / схемы и приложениям - это, конечно, огромные требования, помимо времени отклика. Дайте мне знать, когда вы получите результаты, я также нуждаюсь в информации об этом!
источник
Источник: https://github.com/webcaetano/mongo-mysql
10 рядов
100 рядов
1000 строк
10.000 строк
источник
мужчина ,,, ответ в том, что вы в основном тестируете PHP, а не базу данных.
не повторяйте результаты, независимо от того, комментируете ли вы печать или нет. есть кусок времени.
в то время как другой кусок тратит на сбор кучу рандов.
тогда есть большая разница ч / б взрыва и в.
и наконец то, что здесь происходит. похоже на создание соединения каждый раз, таким образом его тестирование времени соединения плюс время запроса.
против
так что ваш 101% быстрее может оказаться на 1000% быстрее для основного запроса, лишенного джаза.
urghhh.
источник
https://github.com/reoxey/benchmark
эталонный тест
сравнение скорости MySQL и MongoDB в GOLANG1.6 и PHP5
система, используемая для тестирования: процессор DELL i5 4-го поколения 1,70 ГГц * 4 оперативных памяти 4 ГБ оперативная память графического процессора 2 ГБ
Сравнение скорости СУБД с NoSQL для INSERT, SELECT, UPDATE, DELETE, выполняющих различное количество строк 10 100 000 000 100 000 100 000 100 000
Используемый язык: PHP5 и Google самый быстрый язык GO 1.6
источник
Вот небольшое исследование, в котором исследовались СУБД и NoSQL с использованием MySQL против Mongo, выводы были в соответствии с ответом @Sean Reilly. Короче говоря, выгода от дизайна, а не от некоторой необработанной разницы в скорости. Заключение на стр. 35-36:
СУБД и NoSQL: сравнение производительности и масштабирования
источник
На одном сервере MongoDb не будет работать быстрее MyISAM MySQL в режиме чтения и записи, учитывая, что размеры таблиц / документов малы - от 1 до 20 ГБ.
MonoDB будет быстрее при параллельном уменьшении в кластерах с несколькими узлами, где Mysql НЕ может масштабироваться горизонтально.
источник