LoginSignup
3
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-12-22

はじめに

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形式となりますが、速度差や扱いやすさ等を比較してみて、より馴染む方法を探ってみると良いのではないでしょうか。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2