Давно хочу обновить свой сайт до актуальной версии. Но не просто обновить, а практически создать сайт заново и потом инсертить данные в таблицы не изменяя их структуры. При этом правильно создать новые поля в типах контента, избавиться от напрасных компонентов, которые давно удалены, но тут и там всплывают их следы, правильно сделать хуки с учетом накопленного опыта и т.д. То есть глобальная работа над ошибками.
Надеюсь таким образом получить правильно сделанный сайт с правильной структурой и предсказуемым поведением.
Все работы производятся на опенсервере, конфигурация mariadb дефолтная.
Таблицы не мигрирую целиком, а переношу данные инсертом, чтобы не трогать структуру новых таблиц.
То есть например:
INSERT IGNORE INTO новаябаза.cms_comments(`id`, `parent_id`, `level`, `ordering`, `user_id`, `date_pub`, `date_last_modified`, `target_controller`, `target_subject`, `target_id`, `target_url`, `target_title`, `author_name`, `author_email`, `author_url`, `content`, `content_html`, `is_deleted`, `is_private`, `rating`, `is_approved`) SELECT `id`, `parent_id`, `level`, `ordering`, `user_id`, `date_pub`, `date_last_modified`, `target_controller`, `target_subject`, `target_id`, `target_url`, `target_title`, `author_name`, `author_email`, `author_url`, `content`, `content_html`, `is_deleted`, `is_private`, `rating`, `is_approved` FROM стараябаза.cms_comments
SELECT i.*, r.score AS `is_rated`, u.nickname AS `user_nickname`, u.is_deleted AS `user_is_deleted`, u.groups AS `user_groups`, u.avatar AS `user_avatar`, IF(online.date_created IS NOT NULL AND TIMESTAMPDIFF(SECOND, online.date_created, NOW()) <= 180, 1, 0) AS `is_online` FROM cms_comments i LEFT JOIN cms_users AS u ON u.id = i.user_id LEFT JOIN cms_sessions_online AS online ON online.user_id = u.id LEFT JOIN cms_comments_rating AS r ON r.comment_id = i.id AND r.user_id='1' WHERE (i.is_deleted IS NULL) AND (i.is_approved = '1') ORDER BY i.date_pub DESC LIMIT 0, 20 Время выполнения 37.64345 секунд
LEFT JOIN cms_sessions_online AS online ON online.user_id = 1
Стал экспериментировать с индексами таблицы cms_sessions_online. И выяснил интересную вещь. Если добавить в индекс date_created столбец user_id, то запросы в комментариях начинают выполняться за ноль секунд. Всё опять летает!
SELECT i.*, r.score AS `is_rated`, u.nickname AS `user_nickname`, u.is_deleted AS `user_is_deleted`, u.groups AS `user_groups`, u.avatar AS `user_avatar`, IF(online.date_created IS NOT NULL AND TIMESTAMPDIFF(SECOND, online.date_created, NOW()) <= 180, 1, 0) AS `is_online` FROM cms_comments i LEFT JOIN cms_users AS u ON u.id = i.user_id LEFT JOIN cms_sessions_online AS online ON online.user_id = u.id LEFT JOIN cms_comments_rating AS r ON r.comment_id = i.id AND r.user_id='1' WHERE (i.is_deleted IS NULL) AND (i.is_approved = '1') ORDER BY i.date_pub DESC LIMIT 0, 20 Время выполнения 0.00085 секунд