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】
お客様の中に詳しい方がいらっしゃいました :)
@yoku0825 そういえば、昔こんなのが。MySQL5.6には独自のFTSのオプティマイズ処理がありそうです。
http://t.co/eW0UwCe7VH
— Naoya (@naoa_y) 2014, 11月 17
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 件のコメント :
コメントを投稿