MySQL INNER JOIN - '='vs'like'

时间:2012-05-22 03:12:28

标签: mysql activerecord inner-join

我们在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..]
+------------+--------------+------+-----+---------+----------------+

为什么'喜欢'有效并且'='没有?

3 个答案:

答案 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;