2012-05-22 20 views
17

私たちはMySQLの内部結合にいくつかの問題を抱えています。基本的に、 '='演算子を使用すると奇妙なエラーが発生しますが、代わりに 'like'を使用すると動作します。残念ながら、これはActiveRecordによるものであり、代わりに代わりに「好き」を単に叩く簡単な方法はなく、ここで実際に何が起こっているのか理解したい。ここでMySQL INNER JOIN - '=' vs 'like'

は失敗したクエリです:ここでは

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

実際にあなたが期待している結果を実際に与えているようですか?おそらく何かに参加できないことがあるかもしれません(intの意味は何ですか?)ので、有効なクエリがトリガしているメモリの問題を回避してください。 –

+1

@andrewcooke - うーん、 'like'はそのように使われたときにうまくいくように見える:http://sqlfiddle.com/#!2/86792/1 –

+3

これは、各クエリの' explain'を表示するのに役立つかもしれない。 –

答えて

0

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

SELECT COUNT(v.id) FROM versions as v 
INNER JOIN site_versions as sv ON v.id = sv.version_id; 
+1

または単に定数を使用してください: 'SELECT COUNT(1)FROM ... ' – bjnord

+4

OPのような珍しい状況では、自分のような提案にあまり驚かないでください。私はそうではありません。しかし、この文は、「他のフィールドの文脈で作られた、特定のフィールドをカウントするのがベストプラクティスです」* count(*) ''*を使わないでください。将来のことであり、そのような議論の余地はないと言えます。行や他の条件のデータにかかわらず、グループ内の行をカウントするために 'COUNT(*) 'を使用することは、完全に有効であり、標準に従って行われます。たぶん、MySQLにいくつかの意味があるかもしれませんが、そうであると言わなければならないかもしれません。 –

+0

@Andriy - 私はいつも 'count(*)'は可能な限り避けるべきだとも考えましたか?構文は有効でopの問題に関係しないかもしれませんが、確かに[顕著な違いはパフォーマンスが賢明です](http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/)です。私はDBAではありませんが、developperはこれにより可能な場合には常にカウント(*)を避けています。私はここで何か誤解しているかもしれませんが、もし私がしたら私に手がかりを与えてください。 – stefgosselin

3

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

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

もちろん、これはちょうど奇妙なことですが、NDBについてさらに詳しく知りませんが、正しい方向に進むことを願っています。