2013-06-29 4 views
0

Я использую UPDATE, чтобы заполнить недостающее значение в m3, сопоставив m2 с n1, найдя соответствующее значение в n2 и вставив его в m3. Таблица mmm имеет 2,5 миллиона строк, а таблица nnn имеет 55 000 строк.Использование MySQL для запуска обновления на большой таблице очень медленно

Оба этих запроса работают, но проблема в производительности. Сейчас я обновляю mmm по частям. Я уменьшил nnn до его первых 10 000 строк. В этом случае этот частичный запрос завершает около 18% того, что я хочу выполнить через 7 часов. Проблема с этим подходом заключается в том, что я должен сделать примерно 10 дополнительных запросов таким образом. Я знаю, что это много вычислений, но я подумал, что есть лучший способ.

Есть ли способ ускорить этот процесс? Я ценю отзывы.

Запрос # 1

UPDATE mmm, nnn 
SET mmm.m3 = nnn.n2 
WHERE mmm.m2 = nnn.n1 

Запрос # 2

UPDATE mmm a 
    INNER JOIN nnn b 
     ON b.n1 = a.m2 
SET a.m3 = b.n2 
WHERE b.n1 = a.m2 

Таблица ттт (только комбинация является уникальной)

m1   m2    m3 
0002-1962  0025117388 
0002-1962  14644418453  
0003-2417  0026708363 

Таблица NNN (n1 уникален)

n1   n2 
0025117388 1111-2222 
14644418453 1515-2323 
0026708363 1515-2323 

Структура базы данных:

CREATE TABLE `mmm` (
    `m1` char(9) NOT NULL DEFAULT '', 
    `m2` varchar(11) NOT NULL DEFAULT '', 
    `m3` char(9) NULL DEFAULT '' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `nnn` (
    `n1` varchar(11) NOT NULL DEFAULT '', 
    `n2` char(9) NOT NULL DEFAULT '' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

Сколько записей обычно обновляется после выполнения запроса № 1/# 2? –

ответ

4

Вы можете использовать EXPLAIN перед вашим запросом, чтобы увидеть, как MySQL будет обрабатывать выполнение. Без использования какого-либо индекса он должен выполнить полное сканирование таблицы по вашим 2,5 миллионам строк, чтобы выбрать из mmm. Начните с указания основных ключей, чтобы mysql мог использовать их в качестве индексов для запросов. Вы можете обнаружить, что вам также нужно добавить неидеальный индекс в столбец m2 для ускорения выбора.

CREATE TABLE `mmm` (
    `m1` varchar(9) NOT NULL DEFAULT '', 
    `m2` varchar(11) NOT NULL DEFAULT '', 
    `m3` varchar(9) NULL DEFAULT '', 
    primary key (m1, m2, m3) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `nnn` (
    `n1` varchar(11) NOT NULL DEFAULT '', 
    `n2` varchar(9) NOT NULL DEFAULT '', 
    primary key (n1) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+0

Я сделал все, что вы сказали, и это работало ВЕЛИКОЕ. (Создание первичного ключа помогло, но важным изменением было создание индекса в m2.) Я смог обновить 2,5 миллиона записей в mmm против всех 50k записей в nnn менее чем за 20 секунд! Огромное спасибо. Я никогда не получал таких полезных советов. –

Смежные вопросы