2014-03-06 34 views
0

有沒有一種方法來設置一個索引,不使用任何類型的文件在mysql中進行以下查詢?優化子查詢和排序

SELECT * FROM bigtable WHERE id IN ([a indexed subquery]) ORDER BY title; 

這種情況下的ID是主鍵。使用Innodb。 對這種查詢做一個EXPLAIN總是會說它使用的是filesort。

編輯1:

,因爲它在我的情況是自動生成的子查詢並不重要。 但對於參數的緣故讓讓這樣的查詢,而不是

SELECT * FROM bigtable WHERE id IN (4,6,8,7,10,40,21,54...) ORDER BY title; 

有什麼辦法來索引此查詢不使用文件排序爲「ORDER BY」?

獎金問題:有沒有其他數據庫可以做到這一點?

+0

實在不夠充分估計,但看着你的子查詢可能與左加入更好,基於(ID在你的BigTable的索引,其他可能的子查詢列,標題)作爲覆蓋索引。 – DRapp

回答

0

做了大量的研究,並已知道很多關於索引我發現這是不可能的與我的確切示例的當前類型的索引。我其實還沒有找到任何其他的數據庫可以做到這一點。

事實上,最終列表需要由db手動排序,但排序仍然非常快,所以這可能不是一個大問題。感謝所有的答案!

如果我錯了,請大家指正;-)

0

您有權限在數據庫(或任何其他託管在同一個mysql服務器上的數據庫)中創建臨時表嗎?

如果是,那麼我提出以下解決方案:

CREATE TEMPORARY TABLE temp_indexed_subquery 
SELECT id 
FROM bigtable 
WHERE "where conditions"; 
SELECT b.* FROM bigtable AS b 
JOIN temp_indexed_subquery AS t 
ON t.id = b.id; 

如果沒有,那就試試這個:

SELECT b.* 
FROM bigtable 
JOIN (SELECT id FROM bigtable WHERE "where conditions") t ON t.id = b.id; 

它很難幫助更多的不知道表結構或子查詢。

編輯:嗯,我有文件排序有類似的問題,並得到了周圍通過以下方式(修改第一提議的解決方案):

CREATE TEMPORARY TABLE temp_indexed_subquery 
(UNIQUE KEY id(id), KEY title(title)) 
SELECT id, title 
FROM bigtable 
WHERE "where conditions"; 
SELECT b.*, t.title FROM temp_indexed_subquery AS t 
JOIN bigtable AS b 
ON b.id = t.id 
ORDER BY t.title; 

在這裏,我將在臨時表的索引「標題「字段,並按此排序。在我的情況下,這意味着MySQL不必使用filesort來給我一個有序的結果。我希望這有幫助。 (順便說一下,bigtable有多少行,索引子查詢中通常有多少個id)

+0

問題不在於子查詢。子查詢每次都不同,並自動生成。但是我們甚至可以舉例子查詢是ID列表的例子。問題是該列表需要排序。 – doep

0

在某些情況下,MySQL將使用索引進行排序。如果您有bigtable(title)索引,那麼下面的查詢應該使用索引:

select * 
from bigtable 
order by title; 

我希望你的查詢也使用索引,除非「索引子查詢」使優化器us.ea不同的執行計劃。 MySQL做得相當不錯documenting其優化策略爲order by

1

在這裏進行文件操作是否真的很糟糕?從我從例如here它可能被稱爲FILEsort,但實質上它只是一種普通的排序;你在ORDER BY明確要求。

我假設系統使用該索引的id字段來查找相關記錄這是由存儲在id階定義,提取發現的記錄的標題值,然後在返回前導致各種它給客戶端。

我不能想出一個避免這種情況的好方法,也不會這麼做。如果你確實真的想要,你可以嘗試以某種方式將PK更改爲TITLE + ID字段,然後讓查詢掃描整個表以正確的順序找到正確的ID。但是,這將是非常低效的,並且只有(可能)帶有單線程工作。一旦它發生在多個線程上,你仍然需要累積結果並對結果進行排序以確保輸出。考慮到可能存在的優化可能會'搞砸''開始'到'結束'方法'我不會感到驚訝,即使在最好的情況下,系統也會安全地進行排序。

+0

是的,我同意filesort是一個壞名字。我只是在反思「說明」告訴我什麼。 – doep

+0

我只是覺得有點奇怪,沒有辦法完全索引像我的示例一樣的簡單查詢,而沒有進行排序。雖然考慮如何不同的索引工作,我無法找到一個好的解決方案:) – doep