2012-05-22 5 views
17

MySQL 내부 조인에 이상한 문제가 있습니다. 기본적으로 '='연산자를 사용할 때 이상한 오류가 발생하지만 대신 '좋아요'를 사용하면 오류가 발생합니다. 안타깝게도 ActiveRecord를 통해이 작업을 수행 할 수 있습니다. 대신 '좋아요'를 누르기 만하면됩니다. 여기에 실제로 무엇이 일어나고 있는지 이해하고 싶습니다. 여기 MySQL INNER JOIN - '='vs 'like'

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 = `site_versions`.version_id; 

오류입니다 : 여기

가 실패 쿼리입니다 여기

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

또한 각 쿼리의'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 (*) '를 사용하는 것은 표준에 따라 완벽하게 유효합니다. 어쩌면 MySQL에는 몇 가지 의미가있을 수 있지만 그럴 것이라고 언급해야 할 수도 있습니다. –

+0

@Andriy - 가능한 경우'count (*)'는 피해야한다고 생각했습니다. 구문이 유효하고 op 문제와 관련이 없지만 실제로 [현저한 차이가 현저한 성능] (http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/)입니다. 나는 DBA가 아니지만 developper는 항상이 때문에 가능한 경우 '카운트 (count)'를 피했습니다. 나는 뭔가를 오해했을 수도 있습니다. 제발 저에게 단서를주십시오. – stefgosselin

3

아이러니하게도이 최적화 관련이있을 것으로 보인다; LIKE을 사용하면 MySQL에 가능한 인덱스 사용을 중단해야합니다 (숫자 열은 적어도 비교를 위해 문자열을 모두 캐스팅해야하므로).

따라서 =을 사용하면 MySQL이 인덱스 (메모리/디스크)가 부족해져 인덱스를 사용할 수 있습니다 (key_buffer 설정 확인).

물론 이것은 직감이며 NDB에 대해 더 잘 알지 못합니다. 그러나 이것이 올바른 방향으로 나아갈 수 있기를 바랍니다.