MySQL内部连接-“=”vs“like”

MySQL内部连接-“=”vs“like”,mysql,activerecord,inner-join,Mysql,Activerecord,Inner Join,MySQL内部连接有一些奇怪的问题。基本上,当使用“=”操作符时,我们会得到一个奇怪的错误,但是使用“like”可以使它工作。不幸的是,这是通过ActiveRecord实现的,而不是简单地在其中打上“喜欢”,另外,我们还想了解这里到底发生了什么 以下是失败的查询: mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions` ON `versions`.id = `site_versions`

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..]
+------------+--------------+------+-----+---------+----------------+

知道为什么“like”有效而“=”无效吗?

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

SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;
我无法想象在这种情况下like如何工作得很好,但是试着检查变量MaxAllocate的值并增加它怎么样?它的默认值是32M,可以增加到1G


参考资料:

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

因此,使用=似乎MySQL的内存/磁盘空间不足,无法使用索引检查key\u缓冲区设置


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

这样做真的能带来您期望的结果吗?也许只是因为喜欢对ints意味着什么,所以它没有加入任何东西?因此,避免了有效查询触发的内存问题。@andrewcooke-Hmm,like这样使用似乎确实有效:它还可能有助于问题显示每个查询的解释。我认为您需要包括表的数据库引擎的信息。字符串比较在不同的选项之间有很大的不同。在我看来,您的查询没有那么多信息,它应该只提供版本id不为null的站点版本的计数,因此不需要连接。你能解释一下你想从数据中知道什么吗?或者只使用一个常量:SELECT COUNT1 from…在像OP这样的不寻常情况下,千万不要对你的建议感到太惊讶。我不会的。但这句话“计算特定字段的最佳实践”是在另一个字段的上下文中提出的,即“不要使用count*”,听起来像是对未来的一般建议,因此至少可以说是有争议的。根据标准,使用COUNT*对组中的行进行计数,而不考虑行中的数据或任何其他条件,是完全有效的。也许在MySQL中有一些暗示,但是你可能不得不提到它是这样的。@Andrey-我也一直认为应该尽可能避免使用count*?虽然语法是有效的,可能与op的问题无关,但确实存在。虽然我不是DBA,但作为开发人员,我总是尽可能避免计数*,因为这一点。我可能在这里误解了什么,如果我误解了,请给我提示。@stefgosselin,这是一个区别,好吧;在您发布的链接中,count*优于可空列上的count:@stefgosselin:好吧,这篇文章确实展示了count*和countcol在性能上的差异,而且这种差异似乎有利于count*,除非是我遗漏了什么。因此,作为一名开发人员,您可能希望对使用更高效的构造感兴趣,因此我的问题是,为什么要避免计数*?