我需要一些幫助優化我的數據庫的一些查詢。我明白使用索引來幫助連接和通過語句進行排序來幫助加快速度,但是我想知道是否有一些技術可用來避免使用filesort,並在使用EXPLAIN命令時使用臨時文件。這是我正在使用的一個例子。MySQL ORDER BY多連接優化
SELECT a.id, DATE_FORMAT(a.submitted_at, '%d-%b-%Y') as submitted_at, a.user_id,
data1.*,
data2.name, data2.type,
u.first_name, u.last_name
FROM applications AS a
LEFT JOIN users AS u ON u.id = a.user_id
LEFT JOIN score_table AS data1 ON data1.applications_id = a.id
LEFT JOIN sections AS data2 ON data2.id = data1.section_id
WHERE category_id = [value] && submitted_at IS NOT NULL
ORDER BY data2.type
同樣,索引正在我的查詢中正確使用,就像上面的查詢一樣。如果我取出ORDER BY子句,則查詢將使用適當的索引快速執行。我知道連接的順序會影響查詢的性能。當我在用戶表上使用ORDER BY進行測試時,因爲它是「const」之後的下一個表,所以它只會在EXPLAIN上使用「Using where,Using Filesort」。如果我放到任何其他表中,我們會進入「使用臨時」問題。
我的問題是:什麼是最佳方式來優化這樣的查詢運行得更快,在最好的情況下,避免在EXPLAIN中使用filesort/temporary?我對任何可能性都開放:)對於如何使這樣的查詢執行更好的理論,我對或多或少感興趣,而不是這個確切的查詢,因爲我必須在這些深層次的ORDER BY查詢中執行越來越多的查詢我正在處理的數據庫。
- 編輯 -
這裏是上面的查詢的解釋.....
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref category_id,submitted_at category_id 4 const 49 Using where; Using temporary; Using filesort
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 a.user_id 1
1 SIMPLE data1 ref app id app id 4 a.id 7
1 SIMPLE data2 eq_ref PRIMARY PRIMARY 4 data1.section_id 1
你對'連接條件'中的字段和'where'字段中的字段有'索引'嗎?按'排序'? – piotrekkr 2011-12-29 20:46:31
@piotrekkr是的,我(所有上述),我只是編輯我的帖子,以反映這一點。 – n0nag0n 2011-12-29 20:47:29
由於您在一個左連接的表上的ORDER BY,您將無法繞過臨時表的創建。這是因爲MySQL無法驅動來自同一個表的查詢,它按順序排列。 – 2011-12-29 20:49:43