[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Добавление в таблицу столбца
Reh
Есть таблица auto_modify, примерно 36000 строк, это модификации всех авто, нужно было в нее добавить поле тип КПП(test, varchar), написал запрос так

UPDATE auto_modify as m
SET m.test = (SELECT p.value FROM auto_params p WHERE p.param_id = 16 AND p.modify_id = m.id)
WHERE m.test = 0

Он работает, но пипец как долго, уже 2 часа выполняется. В таблице auto_params примерно 1 500 000 строк. Как можно написать чтобы время выполнения было более разумным?
Игорь_Vasinsky

1. я бы в подзапросе использовал LIMIT 1
2.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT TRANSACTION;

хз - алиясы усложняют работу на уровне бд или пофигу, но яб тут не использовал их

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
depp
а сколько у вас всего типов КПП? и как вы их записываете? почему varchar? есть индексы? какие?
DedMorozzz
Переливкой такие апдейты делаются
Создаётся новая таблица, с необходимой структуорой и переливаются в неё данные. Следом таблицы подменяются, а старая удаляется

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Reh
Цитата
а сколько у вас всего типов КПП? и как вы их записываете? почему varchar? есть индексы? какие?


Не смотрел все но точно попадались Автоматическая, Роботизированная еще какая то
Так и записываю

Была старая БД, нужно обновить, а в новой другая структура, вот и нужно ее под старую подогнать.

Цитата
1. я бы в подзапросе использовал LIMIT 1

по таким условиям только одна строка подходит p.param_id = 16 AND p.modify_id = m.id
DedMorozzz
Цитата (Reh @ 21.03.2016 - 14:24)

по таким условиям только одна строка подходит p.param_id = 16 AND p.modify_id = m.id

ещё бы... лимит 1 же

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
DragonNoir
Цитата (Reh @ 21.03.2016 - 15:09)
SELECT p.value FROM auto_params p WHERE p.param_id = 16 AND p.modify_id = m.id


Сколько всего записей в этой таблице? И есть ли составной индекс по полям param_id, modify_id (именно в таком порядке)?


_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
Reh
auto_params около полутора миллионов строк
param_id, modify_id это первичные колючи других таблиц
DragonNoir
Цитата (Reh @ 21.03.2016 - 17:01)
auto_params около полутора миллионов строк


Вот вам ответ на ваш изначальный вопрос. Если таблица auto_modify содержит порядка 36000 записей (при m.test = 0), то умножьте это число еще на полтора миллиона и вы получите примерное число строк, которое обрабатывает мускуль при вашем апдейте.

Цитата (Reh @ 21.03.2016 - 17:01)
param_id, modify_id это первичные колючи других таблиц


А как они связаны с таблицей auto_params? Если только внешними ключами, то они не работают при выборке. Надо делать составной ключ на эти два поля, но с таким количеством записей это тоже процесс не быстрый

_____________
- Сколько тебе надо времени на задачу?
- Месяц.
- А если дам тебе помощника?
- Тогда два месяца.
Reh
Проблема решена, выбрал все данные которые нужно вставить, так же все ид итоговой таблицы и
тупо сделал запрос на обновление в цикле. Заняло где то минуту. Спасибо за участие.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.