今天,我收到的電子郵件從我的託管帳戶說,我需要調整我的查詢:與子查詢的MySQL優化查詢
SELECT
`id`, `nick`, `msg`, `uid`, `show_pic`,
`time`,`ip`,`time_updated`,
(SELECT COUNT(c.msg_id)
FROM `the_ans` c
where c.msg_id = d.id) AS counter,
(SELECT c.msg
FROM `the_ans` c
WHERE c.msg_id=d.id
ORDER BY `time` DESC LIMIT 1) as lastmsg
FROM
`the_data` d
ORDER BY `time_updated` DESC LIMIT 26340 ,15
說明:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY d ALL 34309 Using filesort
3 DEPENDENT SUBQUERY c ALL 43659 Using where; Using filesort
2 DEPENDENT SUBQUERY c ALL 43659 Using where
這個查詢檢查65,396,669,012,829行,這在共享主機中是不可接受的。
TBH,我不明白他們的解釋.. 什麼查詢實際上並是時間去15個職位順序更新, 每篇文章我搶的最新評論, 計數每個帖子所有評論。
posts table - 'the_data'
comments table = 'the_ans'
我不是一個MySQL的大師,我不知道如何改進這個查詢 任何幫助將不勝感激
THX
查詢
SELECT
`id` , `nick` , `msg` , `uid` , `show_pic` , `time` , `ip` , `time_updated` , (
SELECT COUNT(c.msg_id)
FROM `the_ans` c
WHERE c.msg_id = d.id
) AS counter, (
SELECT c.msg
FROM `the_ans` c
WHERE c.msg_id = d.id
ORDER BY `time` DESC
LIMIT 1
) AS lastmsg
FROM `the_data` d
ORDER BY `time_updated` DESC
LIMIT 26340 , 15
這是結果結構
id| nick | msg | uid | show_pick | time | ip |time_updated|counter|lastmsg
| | | | | | | | |
7 | jqman | hello| 10074 | 0 |2013-21-01 | 12 |2013-21-01 | 55 |blah bl
您確定'LIMIT 26340,15'部分? – inhan
基本的問題是需要執行查詢來獲得15行。要執行你的主查詢,每個子查詢都需要爲每一行處理執行。你可以發佈每個表的show create table的結果嗎?你是否在每個表中創建了「id」的索引? – Jaydee
通常,不相關的子查詢將比關聯的子查詢執行得更好。通用語法如下:SELECT x。* FROM my_table x JOIN(SELECT id,MAX(time)max_time FROM my_table GROUP BY id)y ON y.id = x.id AND y.max_time = x.time;這將在每個線程中爲您提供最新的消息。然後,你只需加入其他信息(或反之亦然) – Strawberry