我们在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..]
+------------+--------------+------+-----+---------+----------------+
为什么'喜欢'有效并且'='没有?
答案 0 :(得分:3)
具有讽刺意味的是,这似乎与优化有关;使用LIKE
强制MySQL停止使用可能的索引(至少使用数字列,因为它必须将它们全部转换为字符串以进行比较)。
因此,通过使用=
,似乎MySQL只是耗尽空间(内存/光盘)来使用索引(检查key_buffer
设置)。
当然,这只是一种预感,我不太了解NDB可以进一步帮助你,但我希望这会让你朝着正确的方向前进。
答案 1 :(得分:1)
我无法想象like
在这种情况下如何运作良好,但是如何尝试检查变量MaxAllocate
的值并增加它?其默认值为32M
,最高可增加到1G
。
参考:http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxallocate
答案 2 :(得分:0)
不确定这是否能解决您的问题,但这是可能的。不要使用count(*)
。也许它对于算什么感到“困惑”。计算特定字段的最佳做法,例如id
。为此,您需要为表使用别名。
SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;