Подтвердить что ты не робот

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

Любые идеи, почему "нравится" работает, а "=" - нет?

4b9b3361

Ответ 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;