2012-09-13 46 views
1

即使沒有order by下面的查詢是非常緩慢,我不明白爲什麼。我猜這是where date_affidavit_file,但我怎樣才能讓它快速與order by以及?也許是job_id匹配的地方,然後將其傳遞到代碼的其餘部分,但我仍然需要通過服務器來訂購像這樣的服務器名稱。有什麼建議麼?mysql緩慢複雜的查詢與訂單

explain select sql_no_cache court_county, job.id as jid, job_status, 
    DATE_FORMAT(job.datetime_served, '%m/%d/%Y') as dserved , 
    CONCAT(server.namefirst, ' ', server.namelast) as servername, client_name, 
    DATE_FORMAT(job.datetime_received, '%m/%d/%Y') as dtrec , 
    DATE_FORMAT(job.datetime_give2server, '%m/%d/%Y') as dtg2s, 
    DATE_FORMAT(date_kase_filed, '%m/%d/%Y') as dkf, 
    DATE_FORMAT(job.date_sent_to_court, '%m/%d/%Y') as dtstc , 
    TO_DAYS(datetime_served)-TO_DAYS(date_kase_filed) as totaldays from job 
    left join kase on kase.id=job.kase_id 
    left join server on job.server_id=server.id 
    left join client on kase.client_id=client.id 
    left join LUcourt on LUcourt.id=kase.court_id 
    where date_affidavit_filed is not null and date_affidavit_filed !='' order by servername; 
 
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys  | key  | key_len | ref     | rows | Extra          | 
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+ 
| 1 | SIMPLE  | job  | ALL | date_affidavit_filed | NULL | NULL | NULL     | 365212 | Using where; Using temporary; Using filesort | 
| 1 | SIMPLE  | kase | eq_ref | PRIMARY    | PRIMARY | 4  | pserve.job.kase_id |  1 |            | 
| 1 | SIMPLE  | server | eq_ref | PRIMARY    | PRIMARY | 4  | pserve.job.server_id |  1 |            | 
| 1 | SIMPLE  | client | eq_ref | PRIMARY    | PRIMARY | 4  | pserve.kase.client_id |  1 |            | 
| 1 | SIMPLE  | LUcourt | eq_ref | PRIMARY    | PRIMARY | 4  | pserve.kase.court_id |  1 |            | 
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+
+0

你的桌子上是否有索引? – andrewsi

+0

這可能是http://dba.stackexchange.com/而不是StackOverflow的問題。 – Fluffeh

+0

您正在使用左連接。你期望有任何'null'值嗎? – Arjan

回答

1

檢查是否有以下列的索引。 job.kase_idjob.server_id

此外,您正在訂購的計算字段不是最優的。也許按索引字段排序。

如果您需要保留該確切類別,則可能需要在該數據庫中爲該值添加一個字段。並使用適當的值填充它或在數據庫上設置觸發器以自動填充它。

+0

'使用filesort'可能會讓它變慢 - 我只是不能說爲什麼(它並不總是與簡單的索引有關)。 – Fluffeh

0

當你寫,

where date_affidavit_filed is not null and date_affidavit_filed !='' 

實際上你是選擇最行。或者至少有這麼多,以至於不值得貫穿索引。查詢計劃程序發現涉及date_affidavit_filed的索引,但決定不使用它並使用WHERE子句,該子句僅涉及date_affidavit_filed;所以我們知道這不是關鍵問題,它必須是一個基數問題。

| 1 | SIMPLE  | job  | ALL | date_affidavit_filed | NULL | NULL | NULL     | 365212 | Using where; Using temporary; Using filesort | 

你可以嘗試在順序

date_affidavit_filed, kase_id, server_id 

通過創建索引優化這一點。查詢返回多少行?

0

你正在選擇的東西真的不是空的。 這真的意味着一切。 我不知道你有多少行數據,但需要經過很多行。

嘗試縮小您的查詢到日期範圍或特定客戶端。

如果你確實需要所有的東西,不要一次輸出一行,而是在你用來輸出所有格式的軟件中建立一個大字符串,然後當你完成循環結果和你已經構建了你想要輸出的數據,你可以把它們輸出。

你也可以使用分頁。 只需在頁面1上添加limit 0,30,在頁面2上添加limit 30,30等,然後讓最終用戶瀏覽頁面。如果你做ORDER BY (server.namefirst, server.namelast)代替ORDER BY servername,這應該產生相同的輸出

CREATE INDEX namefull ON server (namefirst,namelast); 

1

這可以通過加快訂單。

您還可以在您要加入的任何字段上的每個表上創建索引,以提高查詢的性能。