17

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

任何想法为什么“喜欢”有效而“=”无效?

4

3 回答 3

3

具有讽刺意味的是,这似乎与优化有关。通过使用LIKE您强制 MySQL 停止使用可能的索引(至少对于数字列,因为它必须将它们全部转换为字符串以进行比较)。

因此,通过使用=似乎 MySQL 只是用完了空间(内存/磁盘)来使用索引(检查key_buffer设置)。

当然,这只是一种预感,我对 NDB 的了解不多,无法进一步帮助您,但我希望这能让您朝着正确的方向前进。

于 2012-05-29T08:15:29.823 回答
1

我无法想象like在这种情况下效果如何,但是尝试检查变量的值MaxAllocate并增加它怎么样?它的默认值是32M并且可以增加到1G.

参考:http ://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxallocate

于 2012-05-29T07:50:01.670 回答
0

不确定这是否会解决您的问题,但这是可能的。不要使用count(*). 也许它对计算什么感到“困惑”。计算特定字段是最佳实践,例如id. 为此,您需要为表使用别名。

SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;
于 2012-05-22T17:51:40.353 回答