MySQL vs MongoDB 1000 leituras
Nota:
- Eu tenho núcleo duplo + (2 threads ) i7 cpu e ram 4GB Tenho 20 partições no MySQL, cada uma com 1 milhão de registos.
Código Da Amostra Utilizado Para Testar O 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;
}
?>
Código Da Amostra Para Testar O 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;
}
?>
7 answers
As pessoas estão a ver o desempenho MongoDB no mundo real, em grande parte porque o MongoDB permite-te consultar num outra maneira que é mais sensata para a sua carga de trabalho.
Por exemplo, considere um desenho que persistiu em muita informação sobre uma entidade complicada de uma forma normalizada. Isso poderia facilmente usar dezenas de tabelas em MySQL (ou qualquer db relacional) para armazenar os dados em forma normal, com muitos índices necessários para garantir a integridade relacional entre as tabelas. Agora considere o mesmo desenho com uma loja de documentos. Se todos esses quadros relacionados estiverem subordinados ao quadro principal (e muitas vezes são), então você pode ser capaz de modelar os dados de modo que toda a entidade é armazenada em um único documento. Em MongoDB você pode armazenar isso como um único documento, em uma única coleção. É aqui que o MongoDB começa a permitir um desempenho superior.Em MongoDB, para recuperar toda a entidade, você tem que executar:
- uma pesquisa de índice na colecção (assumindo que a entidade é obtida pelo id)
- obter o conteúdo de uma página de base de dados (o binário real documento json)
Então um olhar de árvore b, e uma página binária lida. Log (n) + 1 IOs. Se os índices podem residir inteiramente na memória, então 1 IO.
Em MySQL com 20 Mesas, você tem que executar:
- uma pesquisa de índice na tabela raiz (mais uma vez, assumindo que a entidade é obtida pelo id)
- com um índice agrupado, podemos assumir que os valores para a linha raiz estão no índice
- 20 + pesquisa de gama (Esperemos que num índice) para o pk da entidade valor
- estes provavelmente não são índices agrupados, por isso os mesmos 20+ de pesquisa de dados assim que descobrirmos quais são as linhas de crianças apropriadas.
Então o total para o mysql, mesmo assumindo que todos os índices estão na memória (o que é mais difícil, uma vez que existem 20 vezes mais) é cerca de 20 range lookups.
Estas pesquisas de alcance são provavelmente compostas de tabelas IO-diferentes aleatórias irão definitivamente residir em diferentes pontos no disco, e é possível que diferentes linhas na mesma intervalo na mesma tabela para uma entidade pode não ser contíguo (dependendo de como a entidade foi atualizada, etc).
Assim, por exemplo, a contagem final é cerca de 20 vezes mais IO com MySQL por acesso lógico, em comparação com MongoDB.
É assim que o MongoDB pode aumentar o desempenho em alguns casos de uso.
Tem concorrência, isto é, utilizadores simultâneos ? Se você apenas executar 1000 vezes a consulta reta, com apenas um tópico, não haverá quase nenhuma diferença. Demasiado fácil para estes motores:)
, MAS eu sugiro fortemente que você construir um verdadeiro teste de carga da sessão, que significa usar um injector, como o JMeter com 10, 20 ou 50 usuários, AO MESMO TEMPO, então você pode realmente ver a diferença (tentar incorporar a este código dentro de uma página da web JMeter poderia consulta).
Só o fiz hoje numa festa. servidor único (e uma simples coleção / tabela) e os resultados são bastante interessantes e surpreendentes (MongoDb foi muito mais rápido em writes & reads, em comparação com motor MyISAM e motor InnoDb).Isto deve realmente fazer parte do seu teste : motor concurrencial & MySQL. Em seguida, data / schema design & aplicações necessidades são, naturalmente, enormes requisitos, além dos tempos de resposta. Avisa-me quando tiveres resultados, também preciso de informações sobre isto!
Fonte: https://github.com/webcaetano/mongo-mysql
10 linhas
mysql insert: 1702ms
mysql select: 11ms
mongo insert: 47ms
mongo select: 12ms
100 linhas
mysql insert: 8171ms
mysql select: 10ms
mongo insert: 167ms
mongo select: 60ms
1000 linhas
mysql insert: 94813ms (1.58 minutes)
mysql select: 13ms
mongo insert: 1013ms
mongo select: 677ms
10.000 linhas
mysql insert: 924695ms (15.41 minutes)
mysql select: 144ms
mongo insert: 9956ms (9.95 seconds)
mongo select: 4539ms (4.539 seconds)
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
Enquanto a outra parte passa a engordar um monte de números Rands.
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
Então há uma grande diferença entre implodir e implodir.
E finalmente o que se passa aqui. parece que está a criar uma ligação de cada vez, por isso está a testar o tempo de ligação mais a consulta. tempo.
$m = new Mongo();
Vs
$db = new AQLDatabase();
Então, o seu 101% mais rápido pode ser 1000% mais rápido para a consulta subjacente despojada do jazz.
Urghhh.
Https://github.com/reoxey/benchmark
Parâmetro de Referência
Comparação da velocidade de MySQL & MongoDB em GOLANG1. 6 & PHP5
Sistema utilizado para a referência: DELL cpu i5 4th gen 1,70 Ghz * 4 ram 4GB GPU ram 2GB
Comparação de Velocidade de RDBMS vs NoSQL para INSERIR, SELECIONAR, ATUALIZAR, EXCLUIR a execução de um número diferente de linhas 10,100,1000,10000,100000,1000000
A linguagem usada para executar é: PHP5 & Google fastest language GO 1.6
________________________________________________
GOLANG with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 1.195444ms
100 6.075053ms
1000 47.439699ms
10000 483.999809ms
100000 4.707089053s
1000000 49.067407174s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 872.709µs
SELECT & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 20.717354746s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 2.309209968s
100000 257.411502ms
10000 26.73954ms
1000 3.483926ms
100 915.17µs
10 650.166µs
DELETE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 6.065949ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
GOLANG with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 2.067094ms
100 8.841597ms
1000 106.491732ms
10000 998.225023ms
100000 8.98172825s
1000000 1m 29.63203158s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 5.251337439s
FIND & DISPLAY (with index declared)
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 21.540603252s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1 1.330954ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
PHP5 with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 0.0040680000000001s
100 0.011595s
1000 0.049718s
10000 0.457164s
100000 4s
1000000 42s
SELECT
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 <1s
SELECT & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 20s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
________________________________________________
PHP5 with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INSERT
------------------------------------------------
num of rows time taken
------------------------------------------------
10 0.065744s
100 0.190966s
1000 0.2163s
10000 1s
100000 8s
1000000 78s
FIND
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 <1s
FIND & DISPLAY
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 7s
UPDATE
------------------------------------------------
num of rows time taken
------------------------------------------------
1000000 9s
Aqui está uma pequena pesquisa que explorou RDBMS vs NoSQL usando MySQL vs Mongo, as conclusões estavam de acordo com a resposta de @Sean Reilly. Em suma, o benefício vem do projeto, não alguma diferença de velocidade raw. Conclusão na página 35-36:
RDBMS vs NoSQL: comparação de desempenho e escala
O projecto testou, analisou e comparou o desempenho e escalabilidade dos dois tipos de banco de dados. As experiências realizadas incluíram: execucao diferentes números e tipos de consultas, alguns mais complexos do que outros, a fim de analisar o modo como as bases de dados foram aumentadas carregar. O fator mais importante neste caso foi o tipo de consulta usado como MongoDB poderia lidar com perguntas mais complexas mais rápido devido principalmente à sua esquema mais simples no sacrifício da duplicação de dados significa que um A base de dados NoSQL pode conter grandes quantidades de duplicados de dados. Embora um esquema directamente migrado dos RDBMS poderia ser usado. eliminar a vantagem da representação de dados subjacente de MongoDB subdocumentos que permitiram a utilização de menos consultas para o base de dados como tabelas foram combinadas. Apesar do ganho de desempenho que MongoDB tinha sobre MySQL nestas complexas questões, quando a benchmark modelou a consulta MySQL da mesma forma que a consulta complexa MongoDB por usando o aninhado selecciona o MySQL que é melhor, embora em números mais elevados de conexões os dois se comportaram da mesma forma. o último tipo de consulta referencie qual foi a consulta complexa que contém duas ligações e um subquery mostrou a vantagem que MongoDB tem sobre MySQL devido ao seu uso de subdocumentos. Esta vantagem vem ao custo da duplicação de dados o que provoca um aumento no tamanho da base de dados. Se tais consultas são típico em uma aplicação, então é importante considerar NoSQL bases de dados como alternativas conta o custo de armazenamento e tamanho da memória resultante do maior tamanho da base de dados.
Num único servidor, o MongoDb não seria mais rápido do que o MyISAM mysql em leitura e escrita, dada a tabela / doc
os tamanhos são pequenos de 1 GB a 20 GB.
MonoDB será mais rápido em paralelo reduzir em aglomerados multi-nó, onde Mysql não pode escalar horizontalmente.