任何人都知道我可以如何優化這個查詢?它可以工作,但需要很長時間纔會導致服務器超時。mysql大查詢性能改進
$screenRestrict="clientID='1' AND screenID='1'";
$lastupdate="1318515710";
INSERT INTO allvisits (clientID, screenID, hitID, entryPageID, entryPageName, xentryTime, xexitTime, pagecount, minsonsite)(
SELECT
clientID, screenID, id AS hitID, pageID AS entryPageID,
(SELECT name FROM pages WHERE id=entryPageID) AS entryPageName,
(SELECT clicktime FROM clicks WHERE id = hitID AND isFirstClick=1) AS xentryTime,
(SELECT MIN(clicktime) FROM clicks WHERE $screenRestrict AND isLastClick=1 AND clicktime > xentryTime) AS xexitTime,
(SELECT COUNT(*) FROM clicks WHERE $screenRestrict AND clicktime BETWEEN xentryTime AND xexitTime) AS pagecount,
(SELECT (xexitTime-xentryTime)/60) AS minsonsite
FROM clicks WHERE $screenRestrict AND isFirstClick=1 AND clicktime>'$lastupdate'
)
感謝很多:)
更新:
感謝所有的提示。我已經爲isLastClick添加了一個索引,並且設法加快了它的速度,但是在低服務器負載下它仍然需要+10秒。我已經確定了最後一個瓶頸,並在下面標記了它。有沒有更好的方法來選擇晚於xentrytime的第一個「isLastClick」記錄?
SELECT clientid,
screenid,
id AS hitid,
pageid AS entrypageid,
clicktime AS xentrytime,
(SELECT name
FROM pages
WHERE id = entrypageid) AS entrypagename,
(SELECT clicktime
FROM clicks
WHERE clicktime > xentrytime //<<removing this cuts 8.5 seconds!!
AND screenid = '2'
AND islastclick = 1
LIMIT 1) AS xexittime,
(SELECT COUNT(1)
FROM clicks
WHERE screenid = '2'
AND clicktime BETWEEN xentrytime AND xexittime) AS pagecount,
(SELECT (xexittime - xentrytime)/60) AS minsonsite
FROM clicks
WHERE screenid = '2'
AND isfirstclick = 1
AND clicktime > '1318961057'
首先,您應該針對每個選擇的查詢運行'explain'來了解可能存在性能問題的位置。並檢查索引。 – user973254
嘗試將索引添加到您查詢的列中? –
酷不知道「解釋」 - 我會看看它。所有「ID」列都是主鍵。我不認爲點擊表中有任何其他獨特的數據,所以我不知道有什麼方法可以添加索引? – cronoklee