ORDER BY игнорируется при вставке в таблицу MySQL

Я только что обновил сервер MySQL 5.0 до MySQL 5.5 и обнаружил, что сохраненные подпрограммы, которые работали раньше, сломались. Разница: MySQL 5.5, кажется, INSERT строк в произвольном порядке. Таким образом, в следующем коде предложение ORDER BY не действует. Насколько я знаю, раньше это было в MySQL 5.0.

INSERT INTO MyTable
SELECT * FROM MyOtherTable ORDER BY Col1, Col2 DESC;

Люди говорят, что по определению порядок не имеет значения в INSERTs : Просто используйте ORDER BY при использовании SELECT из таблицы. Проблема в том, что я использую курсор для зацикливания таблицы и выполнения сложных операций. Конечно, вместо этого я могу поместить оператор ORDER BY в определение курсора:

DECLARE cur CURSOR FOR SELECT * FROM MyTable ORDER BY Col1, Col2 DESC;

Но это замедляет процедуру: с 10 секунд в MySQL 5.0 до более 10 минут в MySQL 5.5.

Любые идеи о том, как решить проблему?


person Gruber    schedule 13.02.2013    source источник
comment
Вы показываете нам оператор INSERT ... SELECT, но при этом утверждаете, что используете курсор. Что является правдой? При использовании insert ... select нет смысла использовать order by. Зачем нужен порядок при использовании курсора?   -  person a_horse_with_no_name    schedule 13.02.2013
comment
@a_horse_with_no_name: я использую курсор на MyTable, который получил данные от SELECT с ORDER BY. Так что оба верны.   -  person Gruber    schedule 13.02.2013
comment
Так что на самом деле вы не используете insert .. select. Но почему вы (думаете) вам нужен этот приказ?   -  person a_horse_with_no_name    schedule 13.02.2013
comment
@a_horse_with_no_name: Порядок имеет решающее значение, потому что я реализую алгоритм maxim1000 в SQL, что связано с поиском перекрывающихся интервалов. Это больше похоже на процедурный код с добавлением туда и сюда обычного SQL для обработки наборов. Очень удобно избегать использования процедурного языка, поскольку данные берутся из базы данных, а вывод должен храниться в той же базе данных.   -  person Gruber    schedule 13.02.2013
comment
a_horse_with_no_name: Я использую INSERT...SELECT: INSERT INTO MyTable SELECT * FROM MyOtherTable ORDER BY Col1, Col2 DESC; И затем курсор: DECLARE cur CURSOR FOR SELECT * FROM MyTable.   -  person Gruber    schedule 13.02.2013
comment
Удалите order by из первого шага. Это совершенно бесполезно.   -  person a_horse_with_no_name    schedule 13.02.2013
comment
@a_horse_with_no_name: Да, я понял. Как ни странно, это имело эффект в MySQL 5.0.   -  person Gruber    schedule 13.02.2013


Ответы (1)


Добавьте индекс к (Col1, Col2), чтобы ускорить заказ.

person Fabian Schmengler    schedule 13.02.2013
comment
Хорошая идея. Я добавил индекс для соответствующих столбцов, но увидел лишь незначительное влияние на производительность. Разница с использованием курсора без ORDER BY поразительна. - person Gruber; 13.02.2013
comment
Я должен отдать тебе должное. Подпрограмма на самом деле работает сейчас. - person Gruber; 13.02.2013