2013-07-13 5 views
0

Нам нужно запустить скрипт каждые 24 часа, который вычисляет суммы & значений данных из 1 большой таблицы журналов и обновляет данные в Main_Table (Innodb), у которых есть много запросов на выбор/обновление время (примерно 1 раз в секунду)Блокировка данных предотвращает запуск запроса - MySQL InnoDB

Я провел тестовый запрос на локальной БД, которая заняла около 10 минут:

Update Main_Table Set Steps = (Select count(*) From Log_Activity Where Log_Activity.MainID = Main_Table.ID) 

И поскольку это обновляет все строки в Main_Table все застрять в живых проект из-за перетаскивания таблицы. Думаю, мне пришлось убить процесс запроса, чтобы это начало работать правильно снова - данные не были обновлены.

я сделал некоторое рытье и я рассматриваю следующие 3 варианта:

  1. Обновить все данные в временную таблицу, а затем сливаются в Main_Table каким-то образом.
  2. Запустите сценарий в php-циклах вместо 1 запроса MySql (потребуется больше времени, но обновите 1 строку за раз).
  3. Я не уверен, что это связано с нашей проблемой, но я прочитал что-то о «НАЧАЛЬНОЙ ОПЕРАЦИИ ... и т. Д.», И я думаю, что это может быть связано с ... не так ли?

Надеюсь, что кто-то может пролить свет на это и помочь нам. Благодаря

ответ

0
  1. Создать индекс по Log_Activity.MainID, если один уже не существует:

    ALTER TABLE Log_Activity ADD INDEX (MainID); 
    
  2. Создание индекса на Main_Table.ID, если один уже не существует:

    ALTER TABLE Main_Table ADD INDEX (ID); 
    
  3. Повторите свой запрос, чтобы использовать соединение, а не коррелированный подзапрос:

    UPDATE Main_Table JOIN (
        SELECT MainID ID, COUNT(*) c 
        FROM  Log_Activity 
        GROUP BY MainID 
    ) t USING (ID) 
    SET Main_Table.Steps = t.c; 
    
+0

Thanks eggyal! Однако я предпочитаю не создавать индекс для Log_Activity.MainID, потому что эта таблица получает много вставок в минуту (иногда в секунду), и это, как ожидается, будет расти ..) любые другие идеи? – SiteAppDev

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