Skip to content

[Node.js] MySQL Driver Tests

2012/11/14

추가 테스트~

사내 테스트용 가상서버를 받아서 아래 내용을 추가로 테스트 해보았습니다.
가상서버의 스팩은 아래와 같습니다.
CentOS 6.x
Intel® Xeon® Processor E5506
(4M Cache, 2.13 GHz, 4.80 GT/s Intel® QPI)

결과는

| Driver/ORM           | Type | Run 1 | Run 2 | Run 3 | Average|
+----------------------+--------+--------+--------+--------+--------+
| NodeJS_mysql         | driver | 12.035 | 12.081 | 12.024 | 12.04 |
| NodeJS_sequelize_1   | orm    | 32.908 | 30.707 | 31.118 | 31.57 |
| NodeJS_sequelize_10  | orm    | 29.983 | 29.593 | 29.832 | 29.80 |
| NodeJS_mysql_queue   | trans  | 23.666 | 11.337 | 11.689 | 15.56 |
| PHP_PDO              | driver | 2.889  | 2.939  | 2.984  | 2.93 |
| NodeJS_mysql         | driver | 0.021  | 0.022  | 0.018  | .02 |
| NodeJS_sequelize     | orm    | 0.076  | 0.064  | 0.049  | .06 |
| PHP_PDO              | driver | 0.004  | 0.003  | 0.004  | 0 |
+----------------------+--------+--------+--------+--------+--------+

와 같습니다. insert시 순위가 바뀌었는데요;;
확인해 본결과 CPU 때문이 않을까 싶습니다.
node 같은경우 CPU가 100% 까지도 올라갔었습니다.;;
php는 상대적으로 20%까지 올라가고 끝났습니다.

아래 테스트를 진행했던 개인 PC의 사양은
Intel® Core™ i5-760 Processor
(8M Cache, 2.80 GHz)
입니다.

http://www.cpubenchmark.net를 참고해보니
i5-760 = 4000
Xeon E5506 = 3189
이네요.

마지막 추가로
node.js에 node-db-mysql 을 테스트 해보았습니다.
node-db-mysql는 libmysql을 사용합니다.
결과는 같은 가상서버에서 PHP_PDO와 insert시 같은 성능을 내주었습니다만
select시에는 이상하게 NodeJS_mysql와 비슷하거나 약간 나은 성능을 보여주네요;
———————————————————————————–

node.js 로 새로운 프로젝트 하는중에 mysql driver가 필요해서 검색하던중 아래와 같은 글을 찾았다.
For MySQL: Goodbye NodeJS, Welcome Back PHP
저자는 node.js 팬이기는 하지만 node.js와 mysql 간에는 궁합이 안맞다고.. php가 성능이 훨씬 빠르다는 것이다.
그러면서 테스트 결과와 git repo를 올려줘서 궁금한김에 직접 테스트 하다가 이것 저것 고쳐보니 의외의 결과가 나왔다.

우선 php는 잘 할줄 모르고 귀찮아 php용 orm 은 설치하지 않음.

https://github.com/teragoon/MySQL-Driver-ORM-Tests

원 저작자(David)의 결과

| Driver/ORM           | Type   | Run 1 | Run 2 | Run 3 |Average|
+----------------------+--------+-------+-------+-------+-------+
| NodeJS_mysql         | driver | 4.53  | 4.58  | 4.65  | 4.58  |
| NodeJS_sequelize     | orm    | 11.64 | 11.70 | 11.74 | 11.69 |
| PHP_PDO              | driver | 2.14  | 2.21  | 2.21  | 2.18  |
| PHP_laravel_raw      | driver | 3.33  | 3.37  | 3.38  | 3.36  |
| PHP_laravel_eloquent | orm    | 4.52  | 4.38  | 4.37  | 4.42  |
| PHP_doctrine         | orm    | 2.43  | 2.44  | 2.54  | 2.47  |
| PHP_zenddb           | driver | 2.39  | 2.48  | 2.48  | 2.45  |
+----------------------+--------+-------+-------+-------+-------+

내가 해본 결과

| Driver/ORM           | Type | Run 1 | Run 2 | Run 3 | Average|
+----------------------+--------+--------+--------+--------+--------+
| NodeJS_mysql         | driver | 43.148 | 34.969 | 34.792 | |
| NodeJS_sequelize_1   | orm    | 46.830 | 52.933 | 49.480 | |
| NodeJS_sequelize_10  | orm    | 13.408 | 13.241 | 12.648 | |
| NodeJS_mysql_queue   | trans  | 5.358  | 4.880  | 4.741  | |
| PHP_PDO              | driver | 32.905 | 36.375 | 31.431 | |
+----------------------+--------+--------+--------+--------+--------+

일단 전체적으로 David의 결과가 빠른 이유는 ssd상에(ㅠㅠ) 테스트 한 결과임

그리고 실제로 node-mysql 과 php_pdo 를 비교했을때 pdo가 빠름(심하게는 10초). 또한 node용 orm 의 경우 그 차이가 더 심함

하지만 sequelize의 경우 connection pool 을 지원하기 때문에
connection pool을 1개에서 10개로 늘리면 pdo의 1/3수준.
거기에 node-mysql의 queue 및 transaction 기능 확장 모듈인 node-mysql-queue 를 이용해 insert시 transaction을 사용시 1/6로 줄어듬.

php도 connection pool이나 transction을 지원하는 드라이버나 pdo로 사용하는 방법이 있는지는 모르겠지만..^^;
혹시 가능하신분은 git fork 해서 php 구현해주시면 감사.^^

결론은 driver 성능도 중요하지만 insert의 경우 connection pool이나 transaction 같은 기능이 가장 중요하다는 엉뚱한? 결과를 도출.

David가 마지막 결론에 Pick the right tool for the right job 이라고 했는데 right way 라는 말을 추가하고 싶음.

추가
순수 select 성능 비교

| NodeJS_mysql | driver | 0.108 | 0.188 | 0.196 | |
| NodeJS_sequelize | orm | 0.133 | 0.132 | 0.132 | |
| PHP_PDO | driver | 0.004 | 0.004 | 0.003 | |

PDO 압승!

P.S.
node.js의 mysql driver중에 node-db-mysql 가 있는데
http://nodejsdb.org/
node-db is developed with C++ 라는 문구가 있음.
실제 mysql client libraries 가 있어야 함.
windows가 설치 못함.
추후 비교 예정.

One Comment leave one →
  1. 2012/11/14 11:15 오전

    사장님이 이 글 보시면 맥북 프로 사주고 싶어질 것 같은데…🙂

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: