Повышение эффективности MySQL Update Query - PullRequest
1 голос
/ 17 марта 2011

В наших таблицах базы данных мы храним ряд подсчитывающих столбцов, чтобы уменьшить количество простых запросов поиска. Например, в нашей таблице пользователей есть столбцы для количества написанных отзывов, загруженных фотографий, друзей, подписчиков и т. Д. Чтобы обеспечить их синхронизацию, у нас есть скрипт, который периодически запускается для проверки и обновления этих столбцов подсчета. 1001 *

Проблема в том, что теперь, когда наша база данных значительно выросла, запросы, которые мы использовали, выполняются вечно, поскольку они абсолютно неэффективны. Я был бы признателен, если бы кто-то с большим знанием MySQL, чем я, рекомендовал, как мы можем улучшить его эффективность:

update users 
    set photos=(select count(*) 
                    from photos 
                    where photos.status="A" 
                        AND photos.user_id=users.id) 
    where users.status="A";

Если бы это было оператором select, я бы просто использовал соединение, но я не уверен, возможно ли это с обновлением.

Заранее спасибо за помощь!

1 Ответ

4 голосов
/ 17 марта 2011

вы можете сделать что-то вроде этого

UPDATE users u 
       JOIN (SELECT user_id, 
                    COUNT(*) AS c 
             FROM   photos 
             WHERE  status = "A" 
             GROUP  BY user_id) pc 
         ON pc.user_id = u.id 
SET    u.photos = pc.c 

Вам нужны индексы на

  • (photos.status, photos.user_id)
  • (photos.user_id)
  • (users.id)
...