MySQL vs MongoDB 1000 leituras

Tenho estado muito entusiasmada com o MongoDb e tenho andado a testá-lo ultimamente. Eu tinha uma tabela chamada posts em MySQL com cerca de 20 milhões de registros indexados apenas em um campo chamado 'id'.

Eu queria comparar velocidade com MongoDB e fiz um teste que iria obter e imprimir 15 registros aleatoriamente das nossas enormes bases de dados. Eu corri a consulta cerca de 1.000 vezes cada para mysql e MongoDB e estou surpreso que eu não notar uma grande diferença na velocidade. Talvez o MongoDB seja 1,1 vezes mais rápido. Isso é ... muito decepcionante. Há alguma coisa que eu esteja a fazer de errado? Eu sei que meus testes não são perfeitos, mas é MySQL em pé de igualdade com MongoDb quando se trata de ler tarefas intensivas.


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;
}
?>
Author: informatik01, 2012-03-14

7 answers

MongoDB não é magicamente mais rápido. Se você armazenar os mesmos dados, organizados basicamente da mesma forma, e acessá-lo exatamente da mesma forma, então você realmente não deve esperar que seus resultados sejam loucamente diferentes. Afinal de contas, MySQL e MongoDB são ambas GPL, então se Mongo tivesse algum código IO magicamente melhor nele, então a equipe MySQL poderia simplesmente incorporá-lo em sua base de código.

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.

 562
Author: Sean Reilly, 2017-02-11 01:09:58

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!

 51
Author: theAndroid, 2012-04-02 19:07:10

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)
 27
Author: user2081518, 2015-11-16 10:41:33
Meu, a resposta é que estás a testar o PHP e não uma base de dados. Não se incomode com os resultados, quer comente a impressão digital ou não. há muito tempo.
   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.
 17
Author: Gabe Rainbow, 2014-01-02 08:13:09

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
 9
Author: Reoxey, 2016-06-06 09:54:29

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.

 4
Author: Jason Hitchings, 2017-04-11 17:43:46

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.

 -5
Author: zhuomin chen, 2013-10-03 20:21:42