Замена большого процента строк в таблице MySQL - PullRequest
0 голосов
/ 19 октября 2011

Я собираю данные из одной таблицы в другую, используя запрос, подобный следующему:

DELETE FROM wp_popular WHERE popular_type='favorites';
INSERT INTO wp_popular (post_id, popular_type, period, popular_value) 
  SELECT post_id, 'favorites' AS popular_type, '30-days' AS period, COUNT(user_id) AS popular_value ;
  FROM wp_favorites WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= favorited_date 
  GROUP BY post_id;
INSERT INTO wp_popular (post_id, popular_type, period, popular_value) 
  SELECT post_id, 'favorites' AS popular_type, '' AS period, COUNT(user_id) AS popular_value 
  FROM wp_favorites GROUP BY post_id;

Это блокирует стол почти на минуту. Нет хорошо.

Моей первой мыслью было выполнить работу во временной таблице, а затем вывести содержимое в исходную таблицу. Это выглядит примерно так:

CREATE TEMPORARY TABLE wp_new_popular LIKE wp_popular;
INSERT ...
DELETE FROM wp_popular WHERE popular_type='favorites';
INSERT INTO wp_popular SELECT * FROM wp_new_popular;

Эти два последних запроса по-прежнему занимают пару секунд каждый. Любые предложения, как я могу ускорить это?

Я могу немного реструктурировать свое приложение, чтобы содержимое wp_popular было полностью уничтожено и заменено. Тогда я предположил, что смогу TRUNCATE таблицу и заменить ее содержимое. Будет ли быстрее просто удалить wp_popular и переименовать wp_new_popular вместо него? Могу ли я сделать это с временной таблицей?

1 Ответ

0 голосов
/ 22 октября 2011

Решение, которое я придумал, состояло в том, чтобы создать новую (обычную) таблицу, выполнить все мои дорогостоящие операции с ней, а затем заменить ее на существующую таблицу, используя RENAME.Это выглядит примерно так:

CREATE TABLE wp_new_popular LIKE wp_popular;
INSERT ...
RENAME TABLE wp_popular TO wp_old_popular, wp_new_popular TO wp_popular
DROP TABLE wp_old_popular
...