はじめに
MySQLで高速に全文検索するためのオープンソースのストレージエンジンMroongaでは、テーブルのレコード件数をカウントする方法がいくつかあります。
これらの方法のパフォーマンスの違いを簡単に比較してみます。
テストデータ
year
カラムに2001
~2010
を合計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形式となりますが、速度差や扱いやすさ等を比較してみて、より馴染む方法を探ってみると良いのではないでしょうか。