[groonga-dev,01534] Re: mroongaラッパーモードにおける行数カウント高速化とorder by limit 高速化について

Back to archive index

Naoya Murakami visio****@gmail*****
2013年 7月 11日 (木) 13:45:08 JST


お世話になっております。村上です。

テーブル定義と再現手順を用意しました。
以下の実行結果を見ると5.6.12の場合、5.5.14に比べて行数カウントが0.7秒ほど差がでていることがわかります。

<テーブル定義>
CREATE TABLE IF NOT EXISTS `ftext` (
  `pub_id` varchar(45) NOT NULL,
  `pub_year` int(10) unsigned NOT NULL,
  `title` varchar(255) NOT NULL,
  `abstract` text NOT NULL,
  `claims` longtext NOT NULL,
  `description` longtext NOT NULL,
  PRIMARY KEY (`pub_id`,`pub_year`),
  KEY `pub_id` (`pub_id`),
  FULLTEXT KEY `ftext` (`title`,`abstract`,`claims`,`description`) COMMENT
'parser "TokenBigramSplitSymbolAlphaDigit"'
) ENGINE=mroonga DEFAULT CHARSET=utf8 COMMENT='engine "MyISAM"';

<再現手順>

・mktest.sh
#!/bin/sh
i=1
while [ $i -le 100000 ];
do
    id=$((i++));
    echo "insert into ftext
values('JP2003$id','2003','タイトル$id','要約$1','クレーム$id','明細$id');";
done

chmod 775 mktest.sh
./mktest.sh > testdata.sql

mysql -p mrn_test < testdata.sql

select count(*) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) limit 1;
SHOW STATUS LIKE 'Mroonga_count_skip';

select count(*) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) and pub_year = "2003" limit 1;
SHOW STATUS LIKE 'Mroonga_count_skip';

select pub_id,match(title,abstract,claims,description) against("明細" in
boolean mode) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) order by
match(title,abstract,claims,description) against("明細" in boolean mode) desc
limit 5;
SHOW STATUS LIKE 'Mroonga_fast_order_limit';

select pub_id,match(title,abstract,claims,description) against("明細" in
boolean mode) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) order by pub_id desc limit 5;
SHOW STATUS LIKE 'Mroonga_fast_order_limit';

<実行結果>
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.14    |
+-----------+
1 row in set (0.00 sec)

mysql> select count(*) from ftext where
match(title,abstract,claims,description) against("明細" in boolean mode)
limit 1;
・・・
1 row in set (0.73 sec)  ←←Mroonga_count_skipがインクリメントされるが速くなってない。

mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Mroonga_count_skip | 1     |
+--------------------+-------+
1 row in set (0.01 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.69 sec)

mysql> select count(*) from ftext where
match(title,abstract,claims,description) against("明細" in boolean mode) and
pub_year = "2003" limit 1;
・・・
1 row in set (0.74 sec) ←←Mroonga_count_skipがインクリメントされていないケースと略同じ秒数。

mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Mroonga_count_skip | 1     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.12    |
+-----------+
1 row in set (0.00 sec)

mysql> select count(*) from ftext where
match(title,abstract,claims,description) against("明細" in boolean mode)
limit 1;
・・・
1 row in set (0.02 sec) ←←5.6.12の場合、速い。

mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Mroonga_count_skip | 1     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from ftext where
match(title,abstract,claims,description) against("明細" in boolean mode) and
pub_year = "2003" limit 1;
・・・
1 row in set (0.75 sec)

mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Mroonga_count_skip | 1     |
+--------------------+-------+
1 row in set (0.00 sec)


mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select pub_id,match(title,abstract,claims,description) against("明細"
in boolean mode) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) order by
match(title,abstract,claims,description) against("明細" in boolean mode) desc
limit 5;
+--------------+----------------------------------------------------------------------------+
| pub_id       | match(title,abstract,claims,description) against("明細" in
boolean mode) |
+--------------+----------------------------------------------------------------------------+
| JP20031
|
1 |
・・・
| JP2003100000
|
1 |
+--------------+----------------------------------------------------------------------------+
5 rows in set (0.02 sec)

mysql> SHOW STATUS LIKE 'Mroonga_fast_order_limit';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Mroonga_fast_order_limit | 1     |
+--------------------------+-------+
1 row in set (0.00 sec)

mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select pub_id,match(title,abstract,claims,description) against("明細"
in boolean mode) from ftext where match(title,abstract,claims,description)
against("明細" in boolean mode) order by pub_id desc limit 5;

+-------------+----------------------------------------------------------------------------+
| pub_id      | match(title,abstract,claims,description) against("明細" in
boolean mode) |
+-------------+----------------------------------------------------------------------------+
| JP200399999
|
1 |
・・・
| JP200399995
|
1 |
+-------------+----------------------------------------------------------------------------+
5 rows in set (0.76 sec)

mysql> SHOW STATUS LIKE 'Mroonga_fast_order_limit';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Mroonga_fast_order_limit | 1     |  ←match...against以外のソートの場合、高速化は使えない?
+--------------------------+-------+
1 row in set (0.00 sec)



2013年7月11日 11:51 kentoku <kento****@gmail*****>:

> 斯波です。
>
> すみません。
> こちら、テーブル定義をいただくことはできませんでしょうか?
>
> どうぞ、よろしくお願いします。
>
>
>
> 2013年7月10日 10:57 HAYASHI Kentaro <hayas****@clear*****>:
>
> >
> > 林です。
> > お世話になっております。
> >
> > 詳細な報告ありがとうございます!
> >
> > ご質問の件1,2それぞれについてはこちらでも確認の上
> > 回答させていただければと思います。
> >
> > 以上、宜しくお願いいたします。
> >
> > On Tue, 9 Jul 2013 12:52:07 +0900
> > Naoya Murakami <visio****@gmail*****> wrote:
> >
> > > お世話になっております。
> > > 村上と申します。
> > >
> > > 現在、主にmysql5.5.14(spider、VPバンドル版)で
> > > mroonga3.05をMyISAMのラッパーモードで利用しています。
> > >
> > > mariadb10.0.3、mysql5.6.12の性能を試してみたところ、mysql5.6.12のみ、
> > > 行数カウントが高速化されていることに気がつきました。
> > >
> > > 以下のURLを参照すると、ラッパーモードにのみ、行数カウント高速化の項目が
> > > ありませんでしたので、ラッパーモードでは、行数カウント高速化が使えないと
> > > 認識していました。
> > > http://mroonga.org/ja/docs/userguide/storage.html
> > > http://mroonga.org/ja/docs/userguide/wrapper.html
> > >
> > > <質問>
> > > 1.mysql5.5、mariadb10のラッパーモードでは、行数カウント高速化が利用できず、
> > > mysql5.6では、利用できるという認識で正しいでしょうか?
> > > また、今後もこれらのバージョンでは、行数カウントの高速化は使えないのでしょうか?
> > > 可能であれば、spiderが使える、mariadb10または、mysql5.5.14で行数カウント
> > > 高速化が使えると非常にうれしいです。
> > > 今後も行数カウントが使えない場合は、spiderをあきらめて、mysql5.6系を採用する
> > > ことも検討しています。
> > >
> > > 2.上記URLを参照すると、order by limit の高速化の条件として、order byの指定が
> > > カラム(id含む)またはwhere句に指定したmatch...againstであるとありますが、
> > > 前者の条件が使える場合がわかりません。
> > > ここのカラムとは、FULLTEXTインデックスが張られたカラムのことでしょうか?
> > > それともそれ以外の主キー等のINDEXでもよいのでしょうか?
> > >
> > > 当方の環境では、match...againstのソートの場合、高速化が有効になりますが、
> > > 主キーのソートでは、高速化が有効になりません。
> > >
> > > <実行結果>
> > >
> >
> 1.mysql5.5.14の場合、行数カウントが遅い。Mroonga_count_skipはインクリメントされる。(なお、mysql5.5.32、mariadb10.0.3も試してみましたが同様でした。)
> > >
> > > mysql> select version();
> > > +-----------+
> > > | version() |
> > > +-----------+
> > > | 5.5.14    |
> > > +-----------+
> > > mysql> select count(*) from ftext_2003 where
> > > match(title,abstract,claims,description) against("装置") limit 1;
> > > +----------+
> > > | count(*) |
> > > +----------+
> > > |   279519 |
> > > +----------+
> > > 1 row in set (1 min 6.98 sec)
> > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
> > > +--------------------+-------+
> > > | Variable_name      | Value |
> > > +--------------------+-------+
> > > | Mroonga_count_skip | 1     |
> > > +--------------------+-------+
> > > 1 row in set (0.00 sec)
> > >
> > > ・mysql5.6.12の場合、行数カウントが早い。Mroonga_count_skipはインクリメントされる。
> > > mysql> select version();
> > > +-----------+
> > > | version() |
> > > +-----------+
> > > | 5.6.12    |
> > > +-----------+
> > > 1 row in set (0.00 sec)
> > > mysql> select count(*) from ftext_2003 where
> > > match(title,abstract,claims,description) against("装置") limit 1;
> > > +----------+
> > > | count(*) |
> > > +----------+
> > > |   279519 |
> > > +----------+
> > > 1 row in set (0.06 sec)
> > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
> > > +--------------------+-------+
> > > | Variable_name      | Value |
> > > +--------------------+-------+
> > > | Mroonga_count_skip | 1     |
> > > +--------------------+-------+
> > > 1 row in set (0.00 sec)
> > >
> > >
> >
> 3.mysql5.6.12において、行数カウント高速化が効かないsqlにすると実行結果1とほぼ同じ秒数になる。Mroonga_count_skipはインクリメントされない。
> > > mysql> select count(*) from ftext_2003 where
> > > match(title,abstract,claims,description) against("装置") and kind = "A"
> > limit
> > > 1;
> > > +----------+
> > > | count(*) |
> > > +----------+
> > > |   275901 |
> > > +----------+
> > > 1 row in set (1 min 11.53 sec)
> > > mysql> SHOW STATUS LIKE 'Mroonga_count_skip';
> > > +--------------------+-------+
> > > | Variable_name      | Value |
> > > +--------------------+-------+
> > > | Mroonga_count_skip | 1     |
> > > +--------------------+-------+
> > > 1 row in set (0.00 sec)
> > >
> > > 4.mysql5.5.14において、match...againstでorder
> > > byすると、高速化が有効。Mroonga_fast_order_limitがインクリメントされる。
> > >
> > > mysql> select pub_id,match(title,abstract,claims,description)
> > against("装置")
> > > from ftext_2003 where match(title,abstract,claims,description)
> > > against("装置") order by match(title,abstract,claims,description)
> > > against("装置") desc limit 10;
> > > ・・・
> > >
> >
> +--------------+------------------------------------------------------------+
> > > 10 rows in set (0.11 sec)
> > >
> > > mysql> SHOW STATUS LIKE 'Mroonga_fast_order_limit';
> > > +--------------------------+-------+
> > > | Variable_name            | Value |
> > > +--------------------------+-------+
> > > | Mroonga_fast_order_limit | 1     |
> > > +--------------------------+-------+
> > > 1 row in set (0.00 sec)
> > >
> > > 5.mysql5.5.14において、主キーの1つでorder
> > > byすると、高速化が有効にならない。Mroonga_fast_order_limitがインクリメントされない。
> > >
> > > mysql> select pub_id,match(title,abstract,claims,description)
> > against("装置")
> > > from ftext_2003 where match(title,abstract,claims,description)
> > > against("装置") order by pub_id desc limit 10;
> > > ・・・
> > >
> >
> +--------------+------------------------------------------------------------+
> > > 10 rows in set (1 min 7.00 sec)
> > >
> > > mysql> SHOW STATUS LIKE 'Mroonga_fast_order_limit';
> > > +--------------------------+-------+
> > > | Variable_name            | Value |
> > > +--------------------------+-------+
> > > | Mroonga_fast_order_limit | 1     |
> > > +--------------------------+-------+
> > > 1 row in set (0.00 sec)
> > >
> > > 以上です。
> > > _______________________________________________
> > > groonga-dev mailing list
> > > groon****@lists*****
> > > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
> >
> >
> > --
> > HAYASHI Kentaro <hayas****@clear*****>
> >
> > _______________________________________________
> > groonga-dev mailing list
> > groon****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
> >
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>



groonga-dev メーリングリストの案内
Back to archive index