17

MySQLの内部結合でいくつかの奇妙な問題が発生しています。基本的に、「=」演算子を使用すると奇妙なエラーが発生しますが、代わりに「like」を使用すると機能します。残念ながら、これはActiveRecordを介したものであり、代わりに「いいね」を叩く簡単な方法はありません。さらに、ここで実際に何が起こっているのかを理解したいと思います。

失敗するクエリは次のとおりです。

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions`
              ON `versions`.id = `site_versions`.version_id;

エラーは次のとおりです。

ERROR 1296 (HY000): Got error 20008 'Query aborted due to out of query memory'
from NDBCLUSTER

動作するクエリは次のとおりです。

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions`
              ON `versions`.id like `site_versions`.version_id;

テーブル自体の詳細は次のとおりです。

mysql> desc site_versions;
+----------------------+----------+------+-----+---------+----------------+
| Field                | Type     | Null | Key | Default | Extra          |
+----------------------+----------+------+-----+---------+----------------+
| id                   | int(11)  | NO   | PRI | NULL    | auto_increment |
| version_id           | int(11)  | YES  | MUL | NULL    |                |
[..snip..]
+----------------------+----------+------+-----+---------+----------------+

mysql> desc versions;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
[..snip..]
+------------+--------------+------+-----+---------+----------------+

「like」が機能し、「=」が機能しない理由はありますか?

4

3 に答える 3

3

皮肉なことに、これは最適化に関連しているようです。を使用LIKEすることで、MySQL に可能なインデックスの使用を強制的に停止させます (比較のためにすべてを文字列にキャストする必要があるため、少なくとも数値列では)。

その=ため、MySQL を使用すると、インデックスを使用するためのスペース (メモリ/ディスク) が不足しているように見えます (key_buffer設定を確認してください)。

もちろん、これはただの予感であり、NDB について詳しく知ることはできませんが、これが正しい方向に進むことを願っています。

于 2012-05-29T08:15:29.823 に答える
1

likeこの状況でどのように機能するかは想像できませんが、変数の値を確認してMaxAllocate増やしてみてはどうでしょうか。デフォルト値は32Mであり、最大で増やすことができます1G

参照:http ://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxallocate

于 2012-05-29T07:50:01.670 に答える
0

これで問題が解決するかどうかはわかりませんが、可能です。使用しないでくださいcount(*)。何を数えるかについて「混乱」しているのかもしれません。特定のフィールドをカウントするのがベスト プラクティスidです。これを行うには、テーブルのエイリアスを使用する必要があります。

SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;
于 2012-05-22T17:51:40.353 に答える