2012-07-08 136 views
2

我有以下字段的表「內容」:MySQL查詢排序/分組性能

id (an unique, increasing identifier) 
user_id 
content1 
content2 
content3 
... 

該表可以包含來自相同或不同的user_id數據。我試圖選擇按content字段之一排序的數據。不過,我只想從不同的「USER_ID」選擇數據,並始終以用戶的最新條目(所以最高id值)。我不能簡單地group by user_id,因爲編組發生在排序之前。

這就是我目前做:

SELECT * 
FROM `content` 
WHERE `content`.`id` = (
    SELECT `id` 
    FROM `content` as `alt` 
    WHERE `alt`.`user_id` = `content`.`id` 
    ORDER BY `id` DESC 
    LIMIT 1) 
ORDER BY content1 DESC 

它的工作原理,但一旦表變得更大,性能變得太慢。 有人可以給我一個建議如何改善此查詢?

+1

桌上的索引是什麼? – Fluffeh 2012-07-08 02:06:31

+0

這在mysql手冊中進行了說明:http://dev.mysql.com/doc/refman/5.5/en/example-maximum-column-group-row.html – 2012-07-08 04:55:54

回答

3

之所以它與更多的數據速度慢是因爲你的子查詢的每一行content表執行。

這個解決方案應該是更快的子查詢將只執行一次,在該子查詢的結果是那麼加入到同一個表 - utlizing指標:

SELECT b.* 
FROM 
(
    SELECT MAX(id) AS maxid 
    FROM content 
    GROUP BY user_id 
) a 
INNER JOIN content b ON a.maxid = b.id 
ORDER BY b.content1 DESC 
+0

感謝您的快速幫助,這樣做效果更好。 – user1509487 2012-07-08 02:58:20

+0

@ user1509487,太好了!如果您發現此答案有用,請將其標記爲「已接受」。謝謝! – 2012-07-08 03:32:11

0

你需要2步方法不1性能完整的SQL。

  1. 創建臨時表

    創建臨時表id_Temp作爲 選擇id FROM contentalt WHERE altuser_id = content。從臨時表id

  2. 選擇數據

    SELECT * FROM content WHERE contentid =(選擇id_temp ORDER BY ID DESC id限制1) ORDER BY內容1 DESC

以我的經驗

,這2個循序漸進的方式使固定的響應時間。 這種方法,2.5萬頁/天網站便宜2 LIUNX BOX效果很好。