2012-01-13 46 views
1

我有兩個單獨的查詢:子查詢如何複製結果?它是否發送結果中的每一行相同的請求?

SELECT `ad_general`.`id` 
FROM (`ad_general`) 
WHERE `ad_general`.`city` = '708' 
ORDER BY `ad_general`.`id` desc 
LIMIT 15 

SELECT count(`ad_general`.`id`) as count 
FROM (`ad_general`) 
WHERE `city` = '708' 

我已經合併爲避免發送多個請求到MySQL的性能增益結果這兩個查詢。

SELECT `ad_general`.`id`, (
SELECT count(`ad_general`.`id`) as count 
FROM (`ad_general`) 
WHERE `city` = 708) AS count, 
FROM (`ad_general`) 
WHERE `ad_general`.`city` = '708' 
ORDER BY `ad_general`.`id` desc 
LIMIT 15 

在第一種方法中的「數」欄只有一個行,顯然有對數列只有一個請求。

但是在組合查詢「count」列中有15個相同的行。

我想知道mysql如何複製該子查詢中的「count」列。如果它爲每一行發送相同的計數請求(在這種情況下爲15次),在這種情況下使用組合查詢並不明智。

回答

1

在第一個查詢中,您要求數據庫服務器提供兩條信息。首先,表中的前15行。其次,表格中的總行數。

在第二個查詢中,您要求它爲十六個。你想要表的前15行,並且爲每行,你想要的總行數。

這對性能的影響取決於數據庫的細節。但是,不,這不明智:只是做兩個查詢。這是Django等ORM如何處理分頁。

不成熟的優化通常是一個壞主意。如果您不確定發送COUNT查詢是否會傷害您(並且可能不是),請不要增加複雜性來「修復」您不知道的問題。如果你確定它傷害了你,那麼衡量兩者的表現都意味着看哪一個更勝一籌。適當的性能優化(幾乎可以肯定不是必需的)是保持就緒緩存中非規格化的行數。

+0

大多數人建議避免在innodb計數查詢。 – motto 2012-01-14 08:17:39

相關問題