FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

MySQLにてENGINE=MEMORY vs ENGINE=InnoDB(実はFusion-io)ベンチマーク対決!

明けましておめでとうございます。@damayaです。
本年も宜しくお願い申し上げます。
2013年最初の記事はFusion-io ioDrive Duoです!
去年の12/20にGREEプラットフォームにてローンチされた「輪廻のラグランジェ〜ジャージ部ガールズ〜」で、DBにFusion-ioを使用していますので、MySQLでのベンチマーク結果をご紹介します。
f:id:t_onoue:20150722110457p:plain

まず、下記サイトにてMySQLのダミーデーターを生成します。
http://www.generatedata.com/#generator
f:id:t_onoue:20150722110542p:plain

次にDATABASEを作ります。

mysql>CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec)

mysql>use test;
Database changed
mysql>show tables;
Empty set (0.00 sec)


ENGINEがMEMORYのTABLEと、InnoDB(ioDrive)のTABLEを作ります。

mysql>CREATE TABLE TEST_TABLE_MEMORY (
    ->   `ID` mediumint(8) unsigned NOT NULL auto_increment,
    ->   `USER_ID` MEDIUMINT default NULL,
    ->   `NAME` varchar(255) default NULL,
    ->   `EMAIL` varchar(255) default NULL,
    ->   `PASS` varchar(255) default NULL,
    ->   `INSERT_DATE` varchar(50) default NULL,
    ->   PRIMARY KEY (`ID`)
    -> ) ENGINE=MEMORY AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.00 sec)

mysql>CREATE TABLE TEST_TABLE_FUSION (
    ->   `ID` mediumint(8) unsigned NOT NULL auto_increment,
    ->   `USER_ID` MEDIUMINT default NULL,
    ->   `NAME` varchar(255) default NULL,
    ->   `EMAIL` varchar(255) default NULL,
    ->   `PASS` varchar(255) default NULL,
    ->   `INSERT_DATE` varchar(50) default NULL,
    ->   PRIMARY KEY (`ID`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.00 sec)


生成した100万件のダミーデーターをそれぞれのTABLEに追加します。
それでは、SELECT文を実行してみましょう!

mysql>select count(*) from TEST_TABLE_MEMORY;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.00 sec)

mysql>select count(*) from TEST_TABLE_FUSION;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.24 sec)

さすがMEMORY、速い!
しかし、ioDriveも十分速い領域かと思います。

次にLIKE文で3回ずつSELECTしてみます。

mysql>RESET QUERY CACHE;
Query OK, 0 rows affected (0.00 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_MEMORY WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (1.05 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_FUSION WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.70 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_MEMORY WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (1.06 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_FUSION WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.70 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_MEMORY WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (1.06 sec)

mysql>SELECT COUNT(*) FROM TEST_TABLE_FUSION WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.69 sec)

MEMORY1回目:1.05秒
MEMORY2回目:1.06秒
MEMORY3回目:1.06秒
InnoDB(ioDrive)1回目:0.7秒
InnoDB(ioDrive)2回目:0.7秒
InnoDB(ioDrive)3回目:0.69秒

物理メモリーよりもioDriveのほうが約1.5倍速い!!
※インフラ環境は、GMOアプリクラウドです
CPU:Xeon E5620×2
メモリー:128GB
ioDrive:Fusion-io ioDrive Duo 320GB SLC

下記は、おまけ情報です。
(それぞれのEXPLAIN情報)

mysql>EXPLAIN SELECT COUNT(*) FROM TEST_TABLE_MEMORY WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table             | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | TEST_TABLE_MEMORY | ALL  | NULL          | NULL | NULL    | NULL | 1000000 | Using where |
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)

mysql>EXPLAIN SELECT COUNT(*) FROM TEST_TABLE_FUSION WHERE EMAIL LIKE '%purus%' AND INSERT_DATE LIKE '2012-%';
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table             | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | TEST_TABLE_FUSION | ALL  | NULL          | NULL | NULL    | NULL | 1000351 | Using where |
+----+-------------+-------------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)

(100万件のINSERTにかかったそれぞれの平均時間)
MEMORY:10秒
InnoDB(ioDrive):12秒

(DROP TABLEにかかったそれぞれの時間)

mysql>DROP TABLE TEST_TABLE_MEMORY;
Query OK, 0 rows affected (0.01 sec)

mysql>DROP TABLE TEST_TABLE_FUSION;
Query OK, 0 rows affected (0.06 sec)

書き込み時間は、数字で比較するとMEMORYに劣りますが許容範囲かと思います。
結果、ioDriveは物理メモリーとほぼ互角のスペックがでることがわかりました。

それでは、またエンジニアBlogでお会いしましょう!