mroonga

Mroongaにおける様々なレコード件数カウント方法とパフォーマンスについて

More than 5 years have passed since last update.


はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンMroongaでは、テーブルのレコード件数をカウントする方法がいくつかあります。

これらの方法のパフォーマンスの違いを簡単に比較してみます。


テストデータ

yearカラムに20012010を合計10,000,000件(1,000万件)セット

textカラムは空白

CREATE TABLE IF NOT EXISTS `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,
`year` int(11) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`id`),
KEY `year` (`year`),
FULLTEXT INDEX `text` (`text`)
) ENGINE=mroonga DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO test (year) VALUES (2001);
INSERT INTO test (year) VALUES (2002);
INSERT INTO test (year) VALUES (2003);
INSERT INTO test (year) VALUES (2004);
INSERT INTO test (year) VALUES (2005);
INSERT INTO test (year) VALUES (2006);
INSERT INTO test (year) VALUES (2007);
INSERT INTO test (year) VALUES (2008);
INSERT INTO test (year) VALUES (2009);
INSERT INTO test (year) VALUES (2010);
CREATE TABLE IF NOT EXISTS `test2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`year` int(11) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (`id`),
KEY `year` (`year`),
FULLTEXT INDEX `text` (`text`)
) ENGINE=mroonga DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO test2(SELECT '',test.year,'' FROM test, test test2, test test3, test test4,test test5,test test6,test test7);


方法1 - 普通にSQLでカウント

普通にSQLのCOUNT(*)で2005以降のyearの件数をカウントしてみます。

mysql> SELECT COUNT(*) FROM test2 WHERE year > 2005;

+----------+
| COUNT(*) |
+----------+
| 5000000 |
+----------+
1 row in set (2.06 sec)


方法2 - AGAINST句にGroongaのクエリ構文を使う方法でカウント

MroongaによりMySQLで複数インデックスを有効に全文検索する方法 に記載のAGAINST句にGroongaのクエリ構文を利用した最適化の方法を使って2005以降のyearの件数をカウントしてみます。

mysql> SELECT COUNT(*) FROM test2 WHERE MATCH(text) AGAINST('+year:>2005' IN BOOLEAN MO

DE);
+----------+
| COUNT(*) |
+----------+
| 5000000 |
+----------+
1 row in set (2.76 sec)


方法3 - mroonga_commandを使ってカウント

mroonga_commandのUDFを使って、Groongaのselectコマンドにより2005以降のyear件数をカウントしてみます。

mysql> SELECT mroonga_command('select test2 --query +year:>2005 --limit 0 --output_columns _key') as cnt;

+----------------------------------+
| cnt |
+----------------------------------+
| [[[5000000],[["_key","Int32"]]]] |
+----------------------------------+
1 row in set (0.84 sec)


まとめ

複数種類のカウント方法のパフォーマンスを比較してみました。

Mroongaでは、SQLの他に直接Groongaのコマンドを扱うUDFも提供されています。

Groongaのコマンドでは、結果がJSON形式となりますが、速度差や扱いやすさ等を比較してみて、より馴染む方法を探ってみると良いのではないでしょうか。