2012-05-22 246 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..] 
+------------+--------------+------+-----+---------+----------------+ 

任何想法爲什麼'喜歡'的作品和'='不?

+4

就像你期待的結果一樣嗎?也許它只是沒有加入任何東西(因爲int的意思是什麼?),所以避免了有效查詢觸發的內存問題。 –

+1

@andrewcooke - 嗯,'like'在使用這種方式時似乎工作:http://sqlfiddle.com/#!2/86792/1 –

+3

它也可以幫助顯示每個查詢的'解釋'的問題。 –

回答

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,但是由於開發者總是避免使用「count(*)」。我可能在這裏誤解了一些東西,如果我這樣做,請告訴我。 – stefgosselin

3

諷刺的是,這似乎是與優化;通過使用LIKE,你強制MySQL停止使用可能的索引(至少在數字列中,因爲它必須將它們全部轉換爲字符串以進行比較)。

因此,通過使用=似乎MySQL只是用盡空間(內存/磁盤)來使用索引(檢查key_buffer設置)。

當然,這只是一種預感,我對NDB不甚瞭解,可以進一步幫助您,但我希望這會讓您朝着正確的方向前進。