Mysql слишком медленно при копировании в таблицу Tmp - PullRequest
1 голос
/ 08 декабря 2011

У меня есть данные, разбитые по нескольким таблицам mysql, чтобы предотвратить дублирование данных, но присоединение к ним происходит слишком медленно, когда я на самом деле иду обслуживать данные.Таким образом, я создаю намного меньшую таблицу кеша данных, которая, вероятно, потребуется в ближайшем будущем (некоторые данные имеют отношение только к небольшому временному интервалу, поэтому целые таблицы составляют ~ 700 000 строк, а кэш - ~ 6000).
При построении этого кэша используется временная таблица перед копированием в фактическую таблицу кеша, так что, пока таблица создается каждую ночь, таблица живого кеша не отключается.Иногда таблица кеша создается за 30 минут, но иногда она застревает и никогда не завершится.В списке процессов он просто говорит Copying to tmp table, но будет вращаться в течение нескольких дней, если я позволю.

Что я могу сделать, чтобы предотвратить застревание в Copying to tmp table?Я осмотрелся и нигде в Интернете не могу найти очень четкого ответа на причины этого, за исключением некоторой информации здесь , которой я пытался следовать, но безрезультатно.

Я бы подумал, что для меня мог бы быть лучший способ построить таблицу, а не адресную память, поскольку итоговая таблица имеет небольшие строки (хотя каждая строка довольно большая).Общая форма запроса компоновки для создания таблицы кэша:

Select col1,col2,col3... FROM tbl1 INNER JOIN tbl2 on ... INNER JOIN tbl3 on ... 
  LEFT JOIN (SELECT col4, col5, col6... FROM tbl4 INNER JOIN tbl5 on ...) 
  AS tbl6 on ... WHERE col2 > NOW() ORDER BY col3, col4

Требуется левое соединение, так как я хочу иметь копии данных во внутреннем выделении, если оно существует, но не хочуограничьте его, если это не так.
Извините, если этого недостаточно, но если у кого-то есть идеи, как предотвратить Copying to tmp table, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2013

Насколько я понимаю, основной принцип оптимизации MYSQL имеет два полюса (кроме возможностей внешнего ключа):

  • оптимизация размера;
  • оптимизация скорости.

Буквально не принимается за правило о том, что оптимизация mysql:

чем больше размер данных, тем выше производительность и наоборот.

В аналогичном случае мы создали агрегированную таблицу в виде реальной таблицы, а не кэшированной, а не временной таблицы. Это уменьшает количество вычислений и экономит MYSQL на лету для вашего запроса. Затем этот запрос упрощается, очищается от JOIN, вложенных в GROUP BY SELECT, различных функций и т. Д. Данные предварительно максимально сокращаются и минимально обновляются (отдельный запрос или задача Cron).

Создание индексов также уменьшает и увеличивает скорость. Обычно вы включаете имена столбцов из вашего типичного запроса в индекс.

0 голосов
/ 08 декабря 2011

Вы установили индексы для таблиц?Индексы столбцов, которые вы используете в соединениях, ускорят запрос на выборку.Возможно, лучшим решением для вас в этом случае будет материализованное представление: http://fromdual.com/mysql-materialized-views

...