MYSQL запрос, оптимизация - PullRequest
0 голосов
/ 02 марта 2011

Это SQL-запрос, который я использую на странице, которую я строю. В настоящее время он работает около 8 секунд и возвращает 12000 записей, что правильно, но мне интересно, не могли бы вы сделать предложение о том, как я могу сделать это быстрее?

SELECT DISTINCT Advertiser.AdvertiserID, Business.Name, Business.Address1,    Business.Address2, Business.City, Business.State, Business.PostalCode, 
                  Business.Country, Business.Phone, Business.Fax, Business.Email, AdvertiserCategory.CategoryID, AdvertiserCategory.CategoryName AS Category,
                      (SELECT     MAX(PubDate) AS PubDate
                        FROM          NewsPaperAd
                        WHERE      (AdvertiserID = Advertiser.AdvertiserID)
                        GROUP BY AdvertiserID) AS PubDate
FROM Business INNER JOIN
                  Advertiser ON Business.BusinessID = Advertiser.AdvertiserID INNER JOIN
                  Tsheetrecipient ON Advertiser.AdvertiserID = Tsheetrecipient.AdvertiserID LEFT OUTER JOIN
                  AdvertiserCategory INNER JOIN
                  AdvertiserCategoryJoin ON AdvertiserCategory.CategoryID = AdvertiserCategoryJoin.CategoryID ON 
                  Advertiser.AdvertiserID = AdvertiserCategoryJoin.AdvertiserID
WHERE     ((SELECT     MAX(PubDate) AS PubDate
                     FROM         NewsPaperAd AS NewsPaperAd_1
                     WHERE     (AdvertiserID = Advertiser.AdvertiserID)
                     GROUP BY AdvertiserID) IS NOT NULL)
ORDER BY PubDate DESC

Мне действительно интересно, какие есть альтернативы группе по пунктам, поскольку именно это действительно замедляет ее.

Спасибо

Ответы [ 3 ]

1 голос
/ 02 марта 2011

Кроме того, имея предварительный запрос MAX (pubdate) в качестве первой таблицы FROM (псевдоним) и эту фильтрацию по WHERE NOT NULL от PUBDATE, вы будете получать только тех рекламодателей, у которых есть дата публикации. Так как ваш первый запрос должен быть оптимизирован, получить небольшой набор, ТО присоединиться к рекламодателям, бизнесу, категориям и т. Д. Используя STRAIGHT_JOIN, вы сообщаете оптимизатору, что нужно делать это в представленном вами порядке, поэтому он должен FORCE -первый запрос и используйте ТО, чтобы присоединиться к остальной части пути вниз ...

Я бы обеспечил индексирование на NewsPaperAd по идентификатору AdvertiserID и индексирование по остальным критериям JOIN. Без MySQL на этой машине моим единственным сомнительным предложением было бы

ГДЕ PubDate НЕ НУЛЬ

SELECT STRAIGHT_JOIN DISTINCT 
      Advertiser.AdvertiserID,
      Business.Name,
      Business.Address1,
      Business.Address2,
      Business.City,
      Business.State,
      Business.PostalCode,
      Business.Country,
      Business.Phone,
      Business.Fax,
      Business.Email,
      AdvertiserCategory.CategoryID,
      AdvertiserCategory.CategoryName AS Category,
      QualifiedPubs.PubDate
   FROM 
      (SELECT AdvertiserID,
              MAX(PubDate) AS PubDate
          FROM 
              NewsPaperAd
          WHERE
              PubDate IS NOT NULL
          GROUP BY 
             AdvertiserID) AS QualifiedPubs
         INNER JOIN Advertiser 
            ON QualifiedPubs.AdvertiserID = Advertiser.AdvertiserID
            INNER JOIN Business 
               ON Advertiser.AdvertiserID = Business.BusinessID
            INNER JOIN Tsheetrecipient 
               ON Advertiser.AdvertiserID = Tsheetrecipient.AdvertiserID 
            INNER JOIN AdvertiserCategoryJoin 
               ON Advertiser.AdvertiserID = AdvertiserCategoryJoin.AdvertiserID 
               LEFT OUTER JOIN AdvertiserCategory 
                  ON AdvertiserCategoryJoin.CategoryID = AdvertiserCategory.CategoryID
    ORDER BY 
       PubDate DESC 
0 голосов
/ 02 марта 2011

Вы также можете переместить часть выбора максимальной даты в предложение from вместо того, чтобы включать его в предложения select и where.Что-то вроде:

SELECT DISTINCT Advertiser.AdvertiserID, Business.Name, Business.Address1,    Business.Address2, Business.City, Business.State, Business.PostalCode, 
                  Business.Country, Business.Phone, Business.Fax, Business.Email, AdvertiserCategory.CategoryID, AdvertiserCategory.CategoryName AS Category, pd.PubDate
FROM Business INNER JOIN
                  Advertiser ON Business.BusinessID = Advertiser.AdvertiserID INNER JOIN
                  Tsheetrecipient ON Advertiser.AdvertiserID = Tsheetrecipient.AdvertiserID LEFT OUTER JOIN
                  AdvertiserCategory INNER JOIN
                  AdvertiserCategoryJoin ON AdvertiserCategory.CategoryID = AdvertiserCategoryJoin.CategoryID ON 
                  Advertiser.AdvertiserID = AdvertiserCategoryJoin.AdvertiserID,
                  (SELECT    AdvertiserID, MAX(PubDate) AS PubDate
                     FROM         NewsPaperAd
                     GROUP BY AdvertiserID) AS pd
WHERE    
                pd.AdvertiserID = Advertiser.AdvertiserID AND pd.PubDate IS NOT NULL 
ORDER BY PubDate DESC

Примечание. Я не проверял этот запрос, но он должен дать вам общее представление.

0 голосов
/ 02 марта 2011

Прежде чем приступить к настройке запроса, вам, вероятно, лучше настроить индексы для повышения производительности запроса.Индексируется ли поле AdvertiserID?

...