MySQL INNER JOIN - '=' vs 'like'
У нас есть некоторые странные проблемы с внутренними соединениями MySQL. В принципе, мы получаем нечетную ошибку при использовании оператора '=', но вместо этого используйте "like", чтобы он работал. К сожалению, это через ActiveRecord, и нет простого способа просто нажать "like" вместо этого, плюс мы хотим понять, что на самом деле происходит здесь.
Вот запрос, который не выполняется:
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..]
+------------+--------------+------+-----+---------+----------------+
Любые идеи, почему "нравится" работает, а "=" - нет?
Ответы
Ответ 1
По иронии судьбы это, похоже, связано с оптимизацией; используя LIKE
, вы заставляете MySQL прекращать использование возможных индексов (по крайней мере, с числовыми столбцами, потому что для их сравнения нужно привести их все в строку).
Таким образом, используя =
, кажется, что MySQL просто исчерпывает пространство (память/диск) для использования индекса (проверьте настройку key_buffer
).
Конечно, это только догадка, и я мало знаю о NDB, чтобы помочь вам дальше, но я надеюсь, что это приведет вас в правильном направлении.
Ответ 2
Я не могу себе представить, как like
хорошо работает в этой ситуации, но как насчет того, чтобы просто проверить значение переменной MaxAllocate
и увеличить его? Его значение по умолчанию 32M
и может быть увеличено до 1G
.
Ссылка: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxallocate
Ответ 3
Не уверен, что это исправит вашу проблему, но это возможно. Не используйте count(*)
. Может быть, он "запутался" в том, что считать. Лучше всего считать конкретное поле, например. id
. Для этого вам нужно использовать псевдоним для таблиц.
SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;