Bug #1702

SELECT COUNT(*)の値がSELECT *のヒット数よりも多くなる

Added by Kentoku SHIBA about 5 years ago. Updated about 5 years ago.

Status:完了チェック待ちStart date:04/05/2013
Priority:NormalDue date:
Assignee:Kentoku SHIBA% Done:

80%

Category:-
Target version:-

Description

初めて投稿します。古田と申します。
よろしくお願いします。

mroonga使用時のCOUNT値について、期待と異なる動作を確認しましたので報告します。

======================================
mysql> CREATE DATABASE test130402;
Query OK, 1 row affected (0.00 sec)

mysql> USE test130402;
Database changed

mysql> CREATE TABLE `test` (id INTEGER AUTO_INCREMENT, `str1` varchar(255),   `str2` text,   PRIMARY KEY (`id`),   FULLTEXT KEY `test_str1` (`str1`),   FULLTEXT KEY `test_str2` (`str2`) ) ENGINE=mroonga DEFAULT CHARSET=utf8  COMMENT='ENGINE "InnoDB"';
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> INSERT INTO test (str1,str2) VALUES ("山田","東京"),("山田","京都"),("佐藤","東京");
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test;
+----+--------+--------+
| id | str1   | str2   |
+----+--------+--------+
|  1 | 山田   | 東京   |
|  2 | 山田   | 京都   |
|  3 | 佐藤   | 東京   |
+----+--------+--------+
3 rows in set (0.00 sec)

mysql> SELECT count(*) FROM `test` WHERE (MATCH(str1) AGAINST (' +山田' IN BOOLEAN MODE) AND MATCH(str2) AGAINST (' +東京' IN BOOLEAN MODE));
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT * FROM `test` WHERE (MATCH(str1) AGAINST (' +山田' IN BOOLEAN MODE) AND MATCH(str2) AGAINST (' +東京' IN BOOLEAN MODE));
+----+--------+--------+
| id | str1   | str2   |
+----+--------+--------+
|  1 | 山田   | 東京   |
+----+--------+--------+
1 row in set (0.00 sec)
======================================

上記CREATE TABLEでWarningが2個出てますが、うまく対処できず、
また、今回の事象とは直接関係ないと思われたので、すいませんがそのままになってます。
=============================
mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                               |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning |  138 | NormalizerMySQLGeneralCI normalizer isn't found for utf8_general_ci. Install groonga-normalizer-mysql normalizer. NormalizerAuto is used as fallback. |
| Warning |  138 | NormalizerMySQLGeneralCI normalizer isn't found for utf8_general_ci. Install groonga-normalizer-mysql normalizer. NormalizerAuto is used as fallback. |
+---------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
=============================

また、以下に似た現象があったのでquery_cache_sizeを0にしてみましたが、同じく再現します。
http://sourceforge.jp/projects/groonga/lists/archive/dev/2012-June/000924.html

環境は以下です。
* Fedora 17 ( VirtualMachine 4.2.4上で動作 )
* groonga 3.0.0
* mroonga 3.0.1 ( ラッパーモードで利用しています )
* MySQL 5.6.10

以上です。
よろしくお願いします。

History

#1 Updated by Kentoku SHIBA about 5 years ago

  • Status changed from 担当者作業中 to 完了チェック待ち
  • % Done changed from 0 to 80

確認したところ、
・ラッパーモード
・複数のmatch against
・SQL内でPKを利用していない
のケース(COUNTに限らず)で、取得できるレコードに異常が発生していましたので、
修正しました。

Also available in: Atom PDF