Можно ли ускорить состояние потока MySQL «Обновление справочных таблиц»? - PullRequest
2 голосов
/ 13 мая 2011

Это обновление MySQL занимает около 7 секунд, и мне интересно, как улучшить его производительность. Общий запрос был очень медленным, поэтому я начал разбивать его на более мелкие части (100 идентификаторов за раз):

UPDATE results
INNER JOIN urls
  ON urls.id = results.url_id
SET results.url = urls.name
WHERE results.url_id >= 100
  AND results.url_id < 200

В основном я создаю ненормализованную таблицу «результатов», которая изначально имеет значение NULL для results.url. Мне нужно заполнить это из поля urls.name, и это займет слишком много времени. Этот запрос изменяет около 25 000 записей.

Когда я профилирую запрос, вот результаты, которые я вижу:

starting                    0.000052
checking permissions        0.000004
checking permissions        0.000005
Opening tables              0.000012
checking permissions        0.000003
checking permissions        0.000004
System lock                 0.000004
Table lock                  0.000007
init                        0.000013
updating main table         0.000005
optimizing                  0.000015
statistics                  0.000114
preparing                   0.000030
executing                   0.000004
Sending data                0.239372
converting HEAP to MyISAM   0.165893
Sending data                0.239267
updating reference tables   6.585605
end                         0.000029
end                         0.000008
removing tmp table          0.007922
end                         0.000007
query end                   0.000005
freeing items               0.000286
logging slow query          0.000005
cleaning up                 0.000004

Поскольку запрос тратит большую часть своего времени на «обновление» (более 6,5 секунд), могу ли я здесь что-нибудь сделать? Мне не ясно, означает ли это, что MySQL тратит время на поиск строк для обновления, или же он просто копирует биты из одной таблицы в другую.

Если копирование значений из одной таблицы в другую занимает 6,5 секунды, я ничего не могу поделать (я полагаю, поскольку на диск ничего не похоже?) Но если он потратит время на поиск строк в Обновление, я думал, что индекс может помочь. Я добавил индекс на results.url_id, но, похоже, он не работает.

Ответы [ 2 ]

0 голосов
/ 21 августа 2012

Это обновление выполняется часто?

Если так - попробуйте обновить только те значения, которые действительно отличаются.

Если нет - 7 с, скажем, один раз в день довольно быстро.

0 голосов
/ 13 мая 2011

Примените индекс для urls.id и results.url_id, затем повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...