[MONGODB] MySQL은 MongoDB의 대 (1000)는 읽기
MONGODBMySQL은 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.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.당신은 즉 동시성, 동시 사용자가 있습니까? 당신은 단지 하나 개의 스레드 만 바로 1000 번 쿼리를 실행하면 거의 차이가 없습니다. 이 엔진에 너무 쉽게 :)
당신은 즉 동시성, 동시 사용자가 있습니까? 당신은 단지 하나 개의 스레드 만 바로 1000 번 쿼리를 실행하면 거의 차이가 없습니다. 이 엔진에 너무 쉽게 :)
하지만 난 강력하게 당신이 진정한 부하 테스트 세션을 구축 할 것을 제안하는 등 10 JMeter를, 20 당신이 정말로 (차이를 볼 수있는 웹 페이지의 JMeter를 내부에 포함이 코드를 시도 할 수 있도록 동시에 50 명의 사용자로 인젝터를 사용하는 방법 ) 조회 할 수 있습니다.
난 그냥 하나의 서버 (간단한 수집 / 테이블)에 오늘을했고 결과는 (MongoDB를가 쓰기 및에 정말 빨랐다 읽고,의 MyISAM 엔진과 이노 디비 엔진에 비해) 매우 흥미롭고 놀라운 일이다.
동시성 및 MySQL의 엔진이 정말 테스트의 일부가되어야합니다. 그런 다음, 데이터 / 스키마 설계 및 응용 프로그램의 요구는 응답 시간을 넘어 물론 큰 요구 사항입니다. 이것에 대해 입력 할 필요도있어, 당신은 결과를 얻을 때 알려주세요!
-
==============================
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.사람 ,,, 대답은 당신이 기본적으로 데이터베이스를 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.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.여기 몽고 대 MySQL을 사용 NoSQL에 대 RDBMS를 탐구 약간의 조사이며, 결론은 @Sean 라일리의 반응과 인라인했다. 즉, 장점은 디자인이 아니라 일부 원시 속도 차이에서 비롯됩니다. 페이지 35-36의 결론 :
여기 몽고 대 MySQL을 사용 NoSQL에 대 RDBMS를 탐구 약간의 조사이며, 결론은 @Sean 라일리의 반응과 인라인했다. 즉, 장점은 디자인이 아니라 일부 원시 속도 차이에서 비롯됩니다. 페이지 35-36의 결론 :
성능 및 스케일링 비교 : NoSQL에 대 RDBMS
-
==============================
7.단일 서버에서 MongoDB를 주어진 테이블 / 문서, 빨리 읽기 및 쓰기 모두에서 MySQL의 MyISAM 초과 할 수 없습니다 것 크기 20 GB의 1기가바이트 작다. MonoDB 빠른 병렬에 수 MySQL의 수평 확장 할 수 없습니다 다중 노드 클러스터에 줄일 수 있습니다.
단일 서버에서 MongoDB를 주어진 테이블 / 문서, 빨리 읽기 및 쓰기 모두에서 MySQL의 MyISAM 초과 할 수 없습니다 것 크기 20 GB의 1기가바이트 작다. MonoDB 빠른 병렬에 수 MySQL의 수평 확장 할 수 없습니다 다중 노드 클러스터에 줄일 수 있습니다.
from https://stackoverflow.com/questions/9702643/mysql-vs-mongodb-1000-reads by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] pymongo와 정규식 쿼리 수행 (0) | 2019.12.03 |
---|---|
[MONGODB] CSV 가져 오기에 mongoimport를 사용하는 방법 (0) | 2019.12.03 |
[MONGODB] 때 MongoDB를 또는 다른 문서 지향 데이터베이스 시스템을 사용 하는가? [닫은] (0) | 2019.12.03 |
[MONGODB] $ graphLookup에 대한 문자열에 ObjectId가 일치 (0) | 2019.12.03 |
[MONGODB] MongoDB의 : 집계 프레임 워크 : 그룹화 ID 당 마지막 날짜가 문서를 가져 오기 (0) | 2019.12.03 |