powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Производительность update
9 сообщений из 9, страница 1 из 1
Производительность update
    #38522342
ddmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Описание:
Две таблицы.
Одна с полем А заполненным некоторыми кодами и пустым полем Б. (2 млн. записей)
Вторая таблица с теми же полями А и Б, но и Б уже заполнено. То есть это справочник соответствия кодов А кодам Б. (200к записей)
Обе innodb.
На полях А и Б нет индексов.

Задача:
Заполнить в первой таблице поле Б соответствующими значениями из второй таблицы-справочника.

Решение:
Обновляем в цикле пачками, скажем по 100 позиций.
Код: sql
1.
2.
3.
update table1 
   set Б = (select Б from table2 where table2.А = table1.А) 
   where id in (список идентификаторов пачки из 100 элементов)



Проблема:
Каждая итерация выполняется около 1 секунды. Т.е. 1 сек на обновление 100 записей. Что в принципе приемлемо.
Но выполнив ~20 итераций за 1 секунду каждая, следующие ~20 итераций выполняются по ~6 секунд на 100 записей. Потом снова за 1 секунду.
Т.е. производительность падает и растет скачками.

С чем может быть связано подобное поведение?
И, если не затруднит, как бы вы решали подобную задачу?
...
Рейтинг: 0 / 0
Производительность update
    #38522374
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddmaster,

1. версия мускл ?

2. Explain на запросыы, апдейты ?

3. память? железо?

4. издалека похоже что надо таки индексы сделать
и возможно избавится от "IN"
...
Рейтинг: 0 / 0
Производительность update
    #38522454
ddmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

автор1. версия мускл ?
5.5

автор2. Explain на запросыы, апдейты ?
5.5 вроде не умеет для апдейта explain

автор3. память? железо?
память 8гб, AMD Athlon(tm) II X4 645 3,1 ГГц

автор4. издалека похоже что надо таки индексы сделать
можно чуть конкретнее, какие и на какие поля?
...
Рейтинг: 0 / 0
Производительность update
    #38522469
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор5.5 вроде не умеет для апдейта explain

Подразумевалось, что вы перепишете UPDATE как аналогичный SELECT и уже ему сделаете EXPLAIN.
Планы совпадают в таком случае.
...
Рейтинг: 0 / 0
Производительность update
    #38522474
ddmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
EXPLAIN SELECT * 
FROM kladr_street-- SET oktmo = (select okt.oktmo from oktmo okt where ocatd = okt.okato limit 1)
WHERE id
IN ( 1, 2, 3, 4, 5 )



id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE kladr_street range PRIMARY PRIMARY 4 NULL 5 Using where

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtraidselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
...
Рейтинг: 0 / 0
Производительность update
    #38522483
ddmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, если правильно понял:

Код: sql
1.
2.
3.
EXPLAIN SELECT * 
FROM table_1
WHERE id IN ( 1, 2, 3, 4, 5 )



idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEtable_1rangePRIMARYPRIMARY4NULL5Using where

Подзапрос:
Код: sql
1.
2.
3.
4.
EXPLAIN SELECT okt.B
FROM table_2 okt
WHERE 80201000000 = okt.A
LIMIT 1



idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEoktALLNULLNULLNULLNULL171347Using where

P.s.: сорри за предыдущее сообщение, промазал мимо предпросмотра
...
Рейтинг: 0 / 0
Производительность update
    #38522484
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddmaster,

как минимум на table2.А надо индекс
для скорости вот этого куска:
(вы вроде сказали что индексов нет?)

select Б from table2 where table2.А = table1.А

проверьте ЕКПЛЕЙН-ом что новый индекс сработает.
...
Рейтинг: 0 / 0
Производительность update
    #38522490
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ddmasterХм, если правильно понял:

Код: sql
1.
2.
3.
EXPLAIN SELECT * 
FROM table_1
WHERE id IN ( 1, 2, 3, 4, 5 )



idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEtable_1rangePRIMARYPRIMARY4NULL5Using where

Подзапрос:
Код: sql
1.
2.
3.
4.
EXPLAIN SELECT okt.B
FROM table_2 okt
WHERE 80201000000 = okt.A
LIMIT 1



idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEoktALLNULLNULLNULLNULL171347Using where

P.s.: сорри за предыдущее сообщение, промазал мимо предпросмотра

да, во втором случае ЕКПЛАИН говорит что сделает ПОЛНЫЙ СКЛАН по
171347 записй чтон найти одну запись.
Сделайте индекс по Табле2.А и все залетает как наркоман над
маковым полем.
...
Рейтинг: 0 / 0
Производительность update
    #38522518
ddmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

авторСделайте индекс по Табле2.А и все залетает как наркоман над
маковым полем.

Залетало, спасибо огромное)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Производительность update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]