2012-10-30 70 views
1

我有兩個表,其中包含用戶的日常活動。我有兩個加入這些表,並從這張表中選擇十大ID。MYSQL:提高查詢性能加入按訂單條款

表1:buildlog

+----------------+------------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+----------------+------------------------+------+-----+---------+----------------+ 
| NAME   | varchar(50)   | YES |  | NULL |    | 
| ID    | int(11)    | NO | PRI | NULL | auto_increment | 
| DATE_AND_TIME | datetime    | YES |  | NULL |    | 
| COMMENT  | mediumtext    | YES |  | NULL |    | 
+----------------+------------------------+------+-----+---------+----------------+ 

排數作者:276186

表2:報告

+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| r_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| id   | int(15)  | YES | UNI | NULL |    | 
| label   | varchar(200) | YES |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

排數作者:134058

如果我只用id這兩個表使用連接查詢,它會非常快。

查詢1

select buildlog.id,reports.label from buildlog join reports on reports.id = buildlog.id limit 10\G 

查詢時間:10行中集(0.01秒)

如果我通過添加以獲得近十建立IDS,它貼上標籤需要1〜 2分鐘執行。

查詢2

select buildlog.id,reports.label from buildlog join reports on reports.id = buildlog.id order by buildlog.id desc limit 10\G 

查詢時間:10 rows in set (0.98 sec)

以便通過列是一個主鍵buildlog.id。所以,它已經被索引爲什麼它需要更多時間來執行此查詢? 。任何人都可以建議我如何優化這個?

+0

你可以看看執行計劃,但排序總是需要更多時間。我不知道你的記錄數量是否正常。 – Marc

回答

0
SELECT * FROM (
    SELECT 
     buildlog.id, 
     reports.label 
    FROM 
     buildlog 
    JOIN 
     reports 
    ON 
     reports.id = buildlog.id 
) AS myval_new 
ORDER BY id DESC limit 10 

速度減慢是因爲它可能選擇在進行連接之前進行排序。在外部查詢中執行訂單時強制它僅對所選項目進行排序。

+2

嗨,這個查詢不會解決問題,因爲它將所有使用連接查詢的行存儲到一個新的臨時表中。這意味着我的表連接結果是2萬行。它存儲到臨時表中,並將臨時表中的順序應用到臨時表中。這個查詢將比以前慢一些。 – kannanrbk