Byłem bardzo podekscytowany MongoDb i testowałem go ostatnio. Miałem tabelę o nazwie posty w MySQL z około 20 milionami rekordów indeksowanych tylko w polu o nazwie „id”.
Chciałem porównać prędkość z MongoDB i przeprowadziłem test, który losowo pobrałby i wydrukował 15 rekordów z naszych ogromnych baz danych. Uruchomiłem zapytanie około 1000 razy dla mysql i MongoDB i jestem zaskoczony, że nie zauważam dużej różnicy prędkości. Może MongoDB jest 1,1 razy szybszy. To bardzo rozczarowujące. Czy coś robię źle? Wiem, że moje testy nie są idealne, ale MySQL jest na równi z MongoDb, jeśli chodzi o czytanie intensywnych obowiązków.
Uwaga:
- Mam podwójny rdzeń + (2 wątki) i7 procesor i 4 GB RAM
- Mam 20 partycji na MySQL, każdy z 1 milionem rekordów
Przykładowy kod używany do testowania 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;
}
?>
Przykładowy kod do testowania 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;
}
?>
mysql
performance
mongodb
Imran Omar Bukhsh
źródło
źródło
Odpowiedzi:
MongoDB nie jest magicznie szybszy. Jeśli przechowujesz te same dane, uporządkowane zasadniczo w ten sam sposób i uzyskujesz do nich dostęp w dokładnie taki sam sposób, to naprawdę nie powinieneś oczekiwać, że Twoje wyniki będą zupełnie inne. W końcu zarówno MySQL, jak i MongoDB są GPL, więc jeśli Mongo miał w sobie jakiś magicznie lepszy kod IO, zespół MySQL mógłby po prostu włączyć go do swojej bazy kodów.
Ludzie widzą rzeczywistą wydajność MongoDB głównie dlatego, że MongoDB pozwala na zapytania w inny sposób, który jest bardziej odpowiedni dla twojego obciążenia.
Rozważmy na przykład projekt, który zawierał wiele informacji o skomplikowanej jednostce w znormalizowany sposób. Może to z łatwością wykorzystać dziesiątki tabel w MySQL (lub dowolnym relacyjnym pliku db) do przechowywania danych w normalnej formie, z wieloma indeksami potrzebnymi do zapewnienia relacyjnej integralności między tabelami.
Teraz rozważ ten sam projekt z magazynem dokumentów. Jeśli wszystkie powiązane tabele są podrzędne w stosunku do tabeli głównej (a często tak jest), być może uda się modelować dane w taki sposób, że cała jednostka jest przechowywana w jednym dokumencie. W MongoDB możesz przechowywać to jako pojedynczy dokument, w jednej kolekcji. To tutaj MongoDB zaczyna zapewniać doskonałą wydajność.
W MongoDB, aby odzyskać cały byt, musisz wykonać:
Więc wyszukiwanie b-drzewa i odczyt strony binarnej. Log (n) + 1 IO. Jeśli indeksy mogą znajdować się całkowicie w pamięci, to 1 IO.
W MySQL z 20 tabelami musisz wykonać:
Tak więc suma dla mysql, nawet przy założeniu, że wszystkie indeksy są w pamięci (co jest trudniejsze, ponieważ jest ich 20 razy więcej) wynosi około 20 wyszukiwań zakresu.
Te wyszukiwania zakresów prawdopodobnie składają się z przypadkowych operacji we / wy - różne tabele z pewnością będą znajdować się w różnych miejscach na dysku, i możliwe jest, że różne wiersze w tym samym zakresie w tej samej tabeli dla jednostki mogą nie być ciągłe (w zależności od tego, jak jednostka była zaktualizowane itp.).
Tak więc w tym przykładzie końcowa suma to około 20 razy więcej IO z MySQL na logiczny dostęp, w porównaniu do MongoDB.
W ten sposób MongoDB może zwiększyć wydajność w niektórych przypadkach użycia .
źródło
Czy masz współbieżność, tzn. Równoczesnych użytkowników? Jeśli uruchomisz 1000 razy zapytanie prosto z jednym wątkiem, nie będzie prawie żadnej różnicy. Zbyt łatwe dla tych silników :)
ALE zdecydowanie sugeruję, abyś zbudował prawdziwą sesję testowania obciążenia, co oznacza użycie wtryskiwacza takiego jak JMeter z 10, 20 lub 50 użytkownikami W TYM SAMYM CZASIE, aby naprawdę zobaczyć różnicę (spróbuj osadzić ten kod na stronie internetowej JMeter można zapytać).
Właśnie to zrobiłem dzisiaj na jednym serwerze (i prostej kolekcji / tabeli), a wyniki są dość interesujące i zaskakujące (MongoDb był naprawdę szybszy w zapisach i odczytach, w porównaniu do silnika MyISAM i silnika InnoDb).
To naprawdę powinno być częścią twojego testu: współbieżność i silnik MySQL. W związku z tym potrzeby w zakresie projektowania danych / schematów i aplikacji mają ogromne wymagania, wykraczające poza czas reakcji. Daj mi znać, gdy otrzymasz wyniki. Potrzebuję również informacji na ten temat!
źródło
Źródło: https://github.com/webcaetano/mongo-mysql
10 rzędów
100 rzędów
1000 rzędów
10.000 rzędów
źródło
man ,,, odpowiedź jest taka, że w zasadzie testujesz PHP, a nie bazę danych.
nie zawracaj sobie głowy powtarzaniem wyników, komentując wydruk, czy nie. jest kawał czasu.
podczas gdy druga część spędza na zrywaniu szeregu liczb randowych.
wtedy jest zasadnicza różnica między implodami czarno-białymi i cewkami.
i wreszcie co się tutaj dzieje. wygląda jak tworzenie połączenia za każdym razem, a zatem jego testowanie czasu połączenia plus czasu zapytania.
vs
więc twoje 101% szybsze może okazać się 1000% szybsze dla podstawowego zapytania pozbawionego jazzu.
urghhh.
źródło
https://github.com/reoxey/benchmark
reper
porównanie prędkości MySQL i MongoDB w GOLANG 1.6 i PHP5
system zastosowany do testu porównawczego: DELL cpu i5 4. generacji 1.70 Ghz * 4 ram 4 GB GPU ram 2 GB
Porównanie prędkości RDBMS w porównaniu z NoSQL dla INSERT, SELECT, UPDATE, DELETE wykonujących różną liczbę wierszy 10 100,1000,10000,100000,1000000
Językiem używanym do wykonania jest: PHP5 i najszybszy język Google GO 1.6
źródło
Oto kilka badań, które badały RDBMS vs NoSQL przy użyciu MySQL vs Mongo, wnioski były zgodne z odpowiedzią @Sean Reilly. Krótko mówiąc, korzyści płyną z projektu, a nie z pewnej różnicy prędkości. Wniosek na stronie 35–36:
RDBMS vs NoSQL: Porównanie wydajności i skalowania
źródło
Na pojedynczym serwerze MongoDb nie byłby szybszy niż mysql MyISAM zarówno do odczytu, jak i zapisu, biorąc pod uwagę, że rozmiary tabel / dokumentów są małe od 1 GB do 20 GB.
MonoDB będzie szybszy w przypadku Parallel Reduce w klastrach z wieloma węzłami, w których Mysql NIE może skalować się w poziomie.
źródło