оптимизация запросов больших таблиц (mysql) - PullRequest
1 голос
/ 14 мая 2011

Эта таблица содержит 1,2 млн. Результатов, и я не могу отредактировать ее, поскольку есть приложения, к которым у меня также нет исходного кода для доступа к нему. Я хотел бы добавить поле количества, но не могу.

Вот запрос, который я использую:

  SELECT SUM(assets.hourlyEarnings) as earnings, 
         assets_inventory.uid
    FROM (assets)
    JOIN assets_inventory ON assets.id = assets_inventory.assetID
   WHERE assets_inventory.uid IN (SELECT users.uid 
                                    FROM users 
                                   WHERE users.assetTime < 1305350756)
GROUP BY uid

Есть много повторяющихся записей.

Вот таблица:

CREATE TABLE IF NOT EXISTS assets_inventory (
  id int(11) NOT NULL AUTO_INCREMENT,
  uid bigint(20) NOT NULL,
  assetID int(11) NOT NULL,
  PRIMARY KEY (id),
  KEY uid (uid)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1231992 ;

В среднем я потратил 6-7 секунд, чтобы получить результаты, и любое предложение ускорить это будет оценено!

1 Ответ

1 голос
/ 14 мая 2011

Если вы хотите получить список всех uid значений, независимо от того, связаны ли доходы:

   SELECT DISTINCT
          ai.uid,
          COALESCE(x.earnings, 0) AS earnings
     FROM ASSETS_INVENTORY ai
LEFT JOIN (SELECT t.id,
                  SUM(t.hourlyearnings) AS earnings
             FROM ASSETS t
         GROUP BY t.id) x ON x.id = ai.assetid
    WHERE EXISTS (SELECT NULL
                    FROM USERS u
                   WHERE u.uid = ai.uid
                     AND u.assettime < 1305350756)

В противном случае:

  SELECT ai.uid,
         SUM(a.hourlyearnings) AS earnings
    FROM ASSETS_INVENTORY ai
    JOIN ASSETS a ON a.id = ai.assetid
   WHERE EXISTS (SELECT NULL
                   FROM USERS u
                  WHERE u.uid = ai.uid
                    AND u.assettime < 1305350756)
GROUP BY ai.uid

... или:

  SELECT ai.uid,
         SUM(a.hourlyearnings) AS earnings
    FROM ASSETS_INVENTORY ai
    JOIN ASSETS a ON a.id = ai.assetid
    JOIN USERS u ON u.uid = ai.uid
                AND u.assettime < 1305350756
GROUP BY ai.uid
...