MYSQL查询、优化
这是我正在构建的页面中使用的sql查询。它目前运行约8秒,返回12000条记录,这是正确的,但我想知道您是否可以就如何加快运行速度提出可能的建议MYSQL查询、优化,mysql,query-optimization,Mysql,Query Optimization,这是我正在构建的页面中使用的sql查询。它目前运行约8秒,返回12000条记录,这是正确的,但我想知道您是否可以就如何加快运行速度提出可能的建议 SELECT DISTINCT Advertiser.AdvertiserID, Business.Name, Business.Address1, Business.Address2, Business.City, Business.State, Business.PostalCode, Business.
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
我真的很想知道GROUPBY子句有什么替代方案,因为这才是真正让它慢下来的原因
谢谢在开始优化查询之前,最好先优化索引以提高查询性能。广告客户ID字段是否已编制索引?您还可以将select max date部分移动到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
注意:我没有测试这个查询,但它应该会给您一个大致的想法。此外,通过将MAX(pubdate)的预查询作为表(别名)的第一个来源,并在pubdate的WHERE NOT NULL上进行筛选,您将只获得具有发布日期的广告商。这是你的第一个查询应该被优化,得到一个小集合,然后加入到广告商,业务,类别等。通过使用直接连接,告诉优化器按照你给出的顺序进行,所以它应该首先强制预查询,然后使用它来连接剩下的部分 我将确保按广告客户ID对报纸广告进行索引,并根据其他加入标准进行索引。如果这台机器上没有MySQL,我唯一有疑问的条款就是 其中PubDate不为NULL
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
我不明白为什么要用visual studio-2008来标记它。真的没什么好做的-只是一个查询??如何提供您正在尝试做的事情的概述,一些关于表结构、引擎、索引、查询计划等的信息。。。。