2014年11月17日月曜日

Mroonga + MySQL 5.6とMariaDB 10.0だとスピードが結構違う?

あんま真面目に調べてないんですがメモ。


mysql> SELECT COUNT(*) FROM t1 WHERE MATCH(text_column) AGAINST('*D+ xxx' IN BOOLEAN MODE);
+----------+
| COUNT(*) |
+----------+
|    45402 |
+----------+
1 row in set (0.03 sec)

MariaDB [d1]> SELECT COUNT(*) FROM t1 WHERE MATCH(text_column) AGAINST('*D+ xxx' IN BOOLEAN MODE);
+----------+
| COUNT(*) |
+----------+
|    45402 |
+----------+
1 row in set (0.06 sec)

なんか倍くらい違う。


MariaDB [d1]> SHOW PROFILE cpu for query 1;
+-------------------------+----------+----------+------------+
| Status                  | Duration | CPU_user | CPU_system |
+-------------------------+----------+----------+------------+
| starting                | 0.000109 | 0.000000 |   0.000000 |
| checking permissions    | 0.000009 | 0.000000 |   0.000000 |
| Opening tables          | 0.000032 | 0.000000 |   0.000000 |
| After opening tables    | 0.000010 | 0.000000 |   0.000000 |
| System lock             | 0.000008 | 0.000000 |   0.000000 |
| Table lock              | 0.000008 | 0.000000 |   0.001000 |
| After table lock        | 0.000019 | 0.000000 |   0.000000 |
| init                    | 0.000045 | 0.000000 |   0.000000 |
| optimizing              | 0.000347 | 0.000000 |   0.000000 |
| statistics              | 0.000200 | 0.000000 |   0.000000 |
| preparing               | 0.000028 | 0.000000 |   0.000000 |
| FULLTEXT initialization | 0.040459 | 0.027995 |   0.014998 |
| executing               | 0.000024 | 0.000000 |   0.000000 |
| Sending data            | 0.020768 | 0.019997 |   0.000000 |
| end                     | 0.000011 | 0.000000 |   0.000000 |
| query end               | 0.000006 | 0.000000 |   0.000000 |
| closing tables          | 0.000839 | 0.000000 |   0.001000 |
| freeing items           | 0.000012 | 0.000000 |   0.000000 |
| updating status         | 0.000025 | 0.000000 |   0.000000 |
| cleaning up             | 0.000008 | 0.000000 |   0.000000 |
+-------------------------+----------+----------+------------+
20 rows in set (0.00 sec)

mysql> SHOW PROFILE cpu for query 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting             | 0.000057 | 0.000000 |   0.000000 |
| checking permissions | 0.000009 | 0.000000 |   0.000000 |
| Opening tables       | 0.000016 | 0.000000 |   0.000000 |
| init                 | 0.000018 | 0.000000 |   0.000000 |
| System lock          | 0.000007 | 0.000000 |   0.000000 |
| optimizing           | 0.031675 | 0.094985 |   0.011998 |
| executing            | 0.000027 | 0.000000 |   0.000000 |
| end                  | 0.000007 | 0.000000 |   0.000000 |
| query end            | 0.000005 | 0.000000 |   0.000000 |
| closing tables       | 0.000255 | 0.000000 |   0.000000 |
| freeing items        | 0.000344 | 0.002000 |   0.001000 |
| cleaning up          | 0.000005 | 0.000000 |   0.000000 |
+----------------------+----------+----------+------------+
12 rows in set, 1 warning (0.00 sec)

MariaDB 10.0はMySQL 5.5の時と同じような感じで、FULLTEXT initializationとSending Dataがほとんどの時間を占めてる。MySQL 5.6はoptimizingだけに集中している。これは、計上するステージが変わったからなのかなで済むけど、CPU_userを見るとMariaDBでは全て実時間以下のCPU使用時間に対し、MySQL 5.6のoptimizingステージは実時間の3倍くらいのCPU使用時間になっている。

MySQL 5.6、このへんなんかチューニングしてる? それともPROFILINGでやってるから取れてない(MySQL 5.6ではPROFILING非推奨でp_s使えってことになってるから)だけ?


【2014/11/17 16:10】
お客様の中に詳しい方がいらっしゃいました :)




mysql> SET SESSION mroonga_enable_optimization= OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT COUNT(*) FROM t1 WHERE MATCH(text_column) AGAINST('*D+ xxx' IN BOOLEAN MODE);
+----------+
| COUNT(*) |
+----------+
|    45402 |
+----------+
1 row in set (0.04 sec)

確かにMySQL 5.6ではenable_optimization切ってもそんなに変わらない(= Mroongaのoptimizationでなく、MySQLのFTのレイヤーでごにょごにょしてMroongaのAPIを叩いてる?)


MariaDB [d1]> SET SESSION mroonga_enable_optimization= OFF;
Query OK, 0 rows affected (0.00 sec)

MariaDB [d1]> SELECT COUNT(*) FROM t1 WHERE MATCH(search_text) AGAINST('*D+ xxx' IN BOOLEAN MODE);
+----------+
| COUNT(*) |
+----------+
|    45402 |
+----------+
1 row in set (0.22 sec)

MariaDB 10.0はごりっと落ちる。


【2015/05/27 17:25】
全く別の本番データでPercona Server 5.6 + Mroonga (本当はスレッドプールの影響を計りたかったのでスレッドプール有/無) vs. MariaDB 10.0.19 + Mroonga (面倒なのでスレッドプールなしだけ)を計ってみたけど、やっぱりMariaDBの方が結構遅い。

なんなんだろう。。



0 件のコメント :

コメントを投稿