Здравствуйте еще раз rnet ботаники!
Технически Я решил эту проблему, но хочу знать, есть ли более оптимальный маршрут, по которому я должен идти ...
У меня есть большая таблица (~ 4 м строк), которая представляет собой набор данных, сегментированных с использованием int "chip". Имеется 6 сегментов данных, поэтому идентификаторы чипов с 1 по 6.
Из этих 6 сегментов мне нужно присвоить целое число order , которое должно быть итеративным, поскольку оно представляет точное расположение данных на указанном сегменте.
Мое решение (было) это:
# set iterative
set @i:=0;
# init
update table set `order` = @i:=(@i+1) where chip = 1;
Это работает . Но он настолько медленный, что иногда вызывает ошибку тайм-аута. Мне нужно запустить его 6 раз, и он может быть вызван нашим приложением при необходимости. Может быть, мне просто нужно уделить больше времени настройкам MySQL, чтобы учесть медленный запрос, или есть оптимальное, более простое решение для этого?
Спасибо за совет.
Редактировать:
Я нашел решение, которое работает точно и занимает ~ 50 секунд.
Я сейчас использую заказанный оператор select, связанный в обновлении, использует сгенерированную таблицу соединений, которая повторяется в столбце.
См .:
set @count:= 0;
update
table as target,
(select
(@count := @count+1) as row_num,
t.*
from table as t
where chip = 1
order by t.id asc) as table_with_iterative
set target.`order` = table_with_iterative.row_num
where target.id = table_with_iterative.id;