[英]Mysql Sub Select Query Optimization
我每天運行一個查詢來編譯統計信息-但它似乎效率很低。 這是查詢:
SELECT a.id, tstamp, label_id, (SELECT author_id FROM b WHERE b.tid = a.id ORDER BY b.tstamp DESC LIMIT 1) AS author_id
FROM a, b
WHERE (status = '2' OR status = '3')
AND category != 6
AND a.id = b.tid
AND (b.type = 'C' OR b.type = 'R')
AND a.tstamp1 BETWEEN {$timestamp_start} AND {$timestamp_end}
ORDER BY b.tstamp DESC
LIMIT 500
該查詢似乎運行得很慢。 不好意思的命名-我被要求不要透露實際的表名。
之所以有子選擇,是因為外部選擇從表a中獲得一行,而從表b中獲得一行。 但是還需要知道表b中的最新author_id,因此我運行一個subselect來返回該表。 我不想在php循環內運行另一個選擇-因為這也效率低下。
它可以正常工作-我只需要找到一種更快的方法來獲取此數據集。
嘗試:
SELECT a.id,
b.tstamp,
label_id,
y.author_id
FROM TABLE_A a
JOIN TABLE_B b ON b.tid = a.id
JOIN (SELECT b.tid,
MAX(b.tstamp) 'm_tstamp'
FROM TABLE_B b
GROUP BY b.tid) x ON x.tid = a.id
JOIN (SELECT b.tid,
b.author_id,
b.tstamp
FROM TABLE_B b
GROUP BY b.tid) y ON y.tid = a.id
AND y.tstamp = x.m_tstamp
WHERE status IN ('2', '3')
AND b.type IN ('C', 'R')
AND category != 6
AND a.tstamp1 BETWEEN {$timestamp_start} AND {$timestamp_end}
ORDER BY b.tstamp DESC
LIMIT 500
如果b.tstamp
是內唯一b.tid
,采取OMG小馬的解決方案。
否則,您可以嘗試此解決方案。 它通過b.tstamp DESC
對整個結果進行排序,並為每個author_id
添加一個排名。 外部選擇僅采用rank = 1
的行,這是每個author_id
具有最大tstamp
author_id
。
SELECT id, tstamp, label_id, author_id
FROM (SELECT id,
tstamp,
label_id,
author_id,
CASE
WHEN @author_id != author_id THEN @row_num := 1
ELSE @row_num := @row_num + 1
END AS rank,
@author_id := b.author_id
FROM a,
b,
(SELECT @row_num := 0, @author_id := NULL) y
WHERE a.id = b.tid
AND (status = '2' OR status = '3')
AND category != 6
AND (b.type = 'C' OR b.type = 'R')
AND a.tstamp1 BETWEEN {$timestamp_start} AND {$timestamp_end}
ORDER BY b.author_id, b.tstamp DESC
) x
WHERE x.rank = 1
LIMIT 500
我還沒有嘗試過,所以如果它不起作用,請發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.