복붙노트

[MONGODB] MySQL은 MongoDB의 대 (1000)는 읽기

MONGODB

MySQL은 MongoDB의 대 (1000)는 읽기

나는 매우 MongoDB에 대해 흥분되었고, 요즘을 테스트하고있다. 난 단지 'ID'라는 필드에 인덱스 만 (20)에 대한 기록과 MySQL은 게시물라는 테이블을 가지고 있었다.

나는 MongoDB를 함께 속도를 비교하고 싶어 내가 얻고 우리의 거대한 데이터베이스에서 무작위로 (15 개) 기록을 인쇄 할 테스트를 실행. 나는 MySQL과 MongoDB를 1,000 회에 대한 쿼리를 실행하고 나는 속도 차이가 많이 통지를하지 않는 것을 놀라게하고있다. 어쩌면 MongoDB를 1.1 배 빠릅니다. 그것은 매우 실망. 뭔가 내가 잘못 뭐하는 거지인가? 나는 그것이 집중적 집안일을 읽을 때 나의 테스트가 MongoDB를 가진 파에서 MySQL을 완벽 있지만하지 않는 것을 알고있다.

노트 :

테스트 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;
}
?>

해결법

  1. ==============================

    1.MongoDB의 마술 빠른 아니다. 같은 기본적으로 같은 방식으로 조직 된 데이터 및 액세스 그것은 정확히 같은 방식으로 저장하는 경우에, 당신은 정말 당신의 결과는 격렬하게 다른 것으로 기 대해서는 안된다. 결국, MySQL과 MongoDB를이 몽고 후 MySQL의 팀이 그들의 코드베이스에 통합 할 수 그것에 어떤 마술 더 나은 IO 코드를했다 그렇다면, 모두 GPL입니다.

    MongoDB의 마술 빠른 아니다. 같은 기본적으로 같은 방식으로 조직 된 데이터 및 액세스 그것은 정확히 같은 방식으로 저장하는 경우에, 당신은 정말 당신의 결과는 격렬하게 다른 것으로 기 대해서는 안된다. 결국, MySQL과 MongoDB를이 몽고 후 MySQL의 팀이 그들의 코드베이스에 통합 할 수 그것에 어떤 마술 더 나은 IO 코드를했다 그렇다면, 모두 GPL입니다.

    MongoDB를 당신이 당신의 작업 부하에 더 합리적이다 다른 방식으로 쿼리 할 수 ​​있습니다 주로하기 때문에 사람들은 현실 세계 MongoDB의 성능을보고있다.

    예를 들어, 정규화 된 방식으로 복잡한 개체에 대한 많은 정보를 지속 디자인을 고려한다. 이것은 쉽게 MySQL의에서 테이블 수십을 사용할 수 있습니다 (또는 관계형 DB)는 많은 인덱스는 테이블 간의 관계 무결성을 보장하기 위해 필요로 정상적인 형태로 데이터를 저장합니다.

    이제 문서 저장소와 동일한 디자인을 고려한다. 그 관련 테이블의 모든 기본 테이블에 종속 (그들은 종종) 경우에, 당신은 전체 개체가 하나의 문서에 저장되도록 데이터를 모델링 할 수 있습니다. MongoDB를 당신은 하나의 컬렉션, 하나의 문서로이를 저장할 수 있습니다. MongoDB의 우수한 성능을 가능하게 시작하는 곳이다.

    MongoDB를에 전체 개체를 검색하려면 수행해야합니다 :

    A B 트리 검색, 이진 페이지 읽기 그래서. 로그 (N) + 1 개의 IO. 인덱스 메모리, 다음 1 IO 전적으로 상주 할 수 있습니다.

    20 개 테이블 MySQL은, 당신은 수행해야합니다 :

    MySQL을위한 총, 심지어 모든 인덱스 (자세한 중 20 시간이 있기 때문에 더 열심히 인) 메모리에있는 가정 그래서 20 범위 조회에 관한 것입니다.

    다른 테이블 확실히 디스크에 다른 장소에있는 것, 그것은 기업이되었습니다 방법에 따라 (엔티티의 같은 테이블에서 같은 범위에서 다른 행이 연속되지 않을 수도 있습니다 가능성이 있습니다 -이 범위 조회는 가능성이 랜덤 IO 구성되어 있습니다 업데이트 등).

    이 예를 들어, 그래서, 최종 집계는 MongoDB에 비해 약 20 배 더 많은 IO 논리적 액세스 당 MySQL을로입니다.

    이 MongoDB를 일부 사용 사례에서 성능을 향상 할 수있는 방법입니다.

  2. ==============================

    2.당신은 즉 동시성, 동시 사용자가 있습니까? 당신은 단지 하나 개의 스레드 만 바로 1000 번 쿼리를 실행하면 거의 차이가 없습니다. 이 엔진에 너무 쉽게 :)

    당신은 즉 동시성, 동시 사용자가 있습니까? 당신은 단지 하나 개의 스레드 만 바로 1000 번 쿼리를 실행하면 거의 차이가 없습니다. 이 엔진에 너무 쉽게 :)

    하지만 난 강력하게 당신이 진정한 부하 테스트 세션을 구축 할 것을 제안하는 등 10 JMeter를, 20 당신이 정말로 (차이를 볼 수있는 웹 페이지의 JMeter를 내부에 포함이 코드를 시도 할 수 있도록 동시에 50 명의 사용자로 인젝터를 사용하는 방법 ) 조회 할 수 있습니다.

    난 그냥 하나의 서버 (간단한 수집 / 테이블)에 오늘을했고 결과는 (MongoDB를가 쓰기 및에 정말 빨랐다 읽고,의 MyISAM 엔진과 이노 디비 엔진에 비해) 매우 흥미롭고 놀라운 일이다.

    동시성 및 MySQL의 엔진이 정말 테스트의 일부가되어야합니다. 그런 다음, 데이터 / 스키마 설계 및 응용 프로그램의 요구는 응답 시간을 넘어 물론 큰 요구 사항입니다. 이것에 대해 입력 할 필요도있어, 당신은 결과를 얻을 때 알려주세요!

  3. ==============================

    3.출처 : https://github.com/webcaetano/mongo-mysql

    출처 : https://github.com/webcaetano/mongo-mysql

    10 행

    mysql insert: 1702ms
    mysql select: 11ms
    
    mongo insert: 47ms
    mongo select: 12ms
    

    100 개 행

    mysql insert: 8171ms
    mysql select: 10ms
    
    mongo insert: 167ms
    mongo select: 60ms
    

    1000 행

    mysql insert: 94813ms (1.58 minutes)
    mysql select: 13ms
    
    mongo insert: 1013ms
    mongo select: 677ms
    

    10.000 행

    mysql insert: 924695ms (15.41 minutes)
    mysql select: 144ms
    
    mongo insert: 9956ms (9.95 seconds)
    mongo select: 4539ms (4.539 seconds)
    
  4. ==============================

    4.사람 ,,, 대답은 당신이 기본적으로 데이터베이스를 PHP를 테스트하고하지 않을 것입니다.

    사람 ,,, 대답은 당신이 기본적으로 데이터베이스를 PHP를 테스트하고하지 않을 것입니다.

    결과를 반복 귀찮게 인쇄를 주석 여부하지 않습니다. 시간의 덩어리가있다.

       foreach ($cursor as $obj)
        {
            //echo $obj["thread_title"] . "<br><Br>";
        }
    

    다른 청크 랜드 번호의 무리까지 지출 yacking이된다.

    function get_15_random_numbers()
    {
        $numbers = array();
        for($i=1;$i<=15;$i++)
        {
            $numbers[] = mt_rand(1, 20000000) ;
    
        }
        return $numbers;
    }
    

    다음 주요 차분 B / W 및 내파에서 프로그래머.

    그리고 마지막으로 여기에 무슨 일이 일어나고 있는지. 따라서 그것의 연결 시간을 더한 쿼리 시간을 테스트 연결 각 시간을 만드는 것 같습니다.

    $m = new Mongo();
    

    $db = new AQLDatabase();
    

    그래서 당신의 101 % 빠른 재즈 박탈 기본 쿼리 1000 % 빠른 것으로 판명 수 있습니다.

    urghhh.

  5. ==============================

    5.https://github.com/reoxey/benchmark

    https://github.com/reoxey/benchmark

    기준

    GOLANG1.6 & PHP5에서 MySQL을 & MongoDB의 속도 비교

    벤치 마크에 사용되는 시스템 : DELL의 CPU I5 4 세대 1.70Ghz * 4 램 4기가바이트 GPU 램 2기가바이트

    RDBMS 속도 비교 INSERT, SELECT, UPDATE NoSQL에 대한 대 행 10,100,1000,10000,100000,1000000의 다른 번호를 실행 삭제

    PHP5 및 구글 빠른 언어 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
    
  6. ==============================

    6.여기 몽고 대 MySQL을 사용 NoSQL에 대 RDBMS를 탐구 약간의 조사이며, 결론은 @Sean 라일리의 반응과 인라인했다. 즉, 장점은 디자인이 아니라 일부 원시 속도 차이에서 비롯됩니다. 페이지 35-36의 결론 :

    여기 몽고 대 MySQL을 사용 NoSQL에 대 RDBMS를 탐구 약간의 조사이며, 결론은 @Sean 라일리의 반응과 인라인했다. 즉, 장점은 디자인이 아니라 일부 원시 속도 차이에서 비롯됩니다. 페이지 35-36의 결론 :

    성능 및 스케일링 비교 : NoSQL에 대 RDBMS

  7. ==============================

    7.단일 서버에서 MongoDB를 주어진 테이블 / 문서, 빨리 읽기 및 쓰기 모두에서 MySQL의 MyISAM 초과 할 수 없습니다 것 크기 20 GB의 1기가바이트 작다. MonoDB 빠른 병렬에 수 MySQL의 수평 확장 할 수 없습니다 다중 노드 클러스터에 줄일 수 있습니다.

    단일 서버에서 MongoDB를 주어진 테이블 / 문서, 빨리 읽기 및 쓰기 모두에서 MySQL의 MyISAM 초과 할 수 없습니다 것 크기 20 GB의 1기가바이트 작다. MonoDB 빠른 병렬에 수 MySQL의 수평 확장 할 수 없습니다 다중 노드 클러스터에 줄일 수 있습니다.

  8. from https://stackoverflow.com/questions/9702643/mysql-vs-mongodb-1000-reads by cc-by-sa and MIT license