InnoDB и tmp_table проблема - PullRequest
       22

InnoDB и tmp_table проблема

1 голос
/ 11 мая 2011

У меня есть набор из трех таблиц InnoDB на сервере MySQL, на котором я делаю простой SELECT.

SELECT s.type, s.Price,l.ratio, o.type, 
FROM Structures s, Orders o, Legs l 

WHERE s.type in ('type1','type2',...)  
AND o.ID >= s.ID* 10  
AND o.ID<= s.ID * 10 + s.orderNumber -1  
AND l.ID >= s.ID * 10  
AND l.ID <= s.ID * 10 + s.legNumber -1  

ORDER BY s.type, s.FurthestExpiration, s.NearestExpiration

После добавления определенного количества строк (около 1800 для структур, 3000 для ног и заказов) я не могу выполнить этот запрос и вижу в рабочей среде MySQL, что состояние запроса равно

Copying to the tmp table. 

Запрос никогда не заканчивается.

Некоторые замечания:

  1. Если я выполняю тот же запрос в Workbench, он выполняется успешно.
  2. Если я удалю предложение ORDER BY, оно выполнится успешно.
  3. Если я переключаю двигатель с InnoDB на MyISAM, он работает.

Меня не особо волнует использование InnoDB или MyISAM, но я не уверен, что это несовместимо с InnoDB, я подозреваю, что в моих параметрах / дизайне БД есть некоторые проблемы.

Спасибо за любую подсказку!

1 Ответ

0 голосов
/ 11 мая 2011

Я не уверен, что согласен с тем, что это «простой выбор». Что ты хочешь здесь делать? Потому что, если я вижу это правильно, это будет ОГРОМНОЕ (неявное) соединение. Вы присоединяетесь, говоря это: FROM Structures s, Orders o, Legs l, но s.id = o.id ничего подобного нет, только сравнение. Насколько большим будет ваш набор результатов? Там может быть нелегкий индекс, но вам придется проверить EXPLAIN для этого.

В любом случае, я не вижу причин, по которым он никогда не должен завершиться, хотя из-за того, что сам запрос не очень эффективен, может пройти много времени, прежде чем это состояние Copying to the tmp table. завершится. (очевидно, в зависимости от факта , если запрос неэффективен :)) Может быть, вы достигаете некоторого ограничения (кэширования, памяти и т. Д.) На это количество строк, и поэтому оно начинает становиться очень медленным, и похоже, что оно не заканчивается.

Я бы посоветовал сделать несколько явных объединений (table1 t1 JOIN table2 t2 ON t1.id = t2.id), если это возможно, или хотя бы проверить, насколько «тяжелым» является запрос.

...