在對具有非常高的I/O等待的服務器進行故障診斷時,我注意到存在來自執行SELECT max(x) FROM t WHERE y = ?
的查詢的大量I/O。向後索引掃描與索引掃描
我的指數是btree (x, y)
。
我注意到查詢計劃確實索引掃描向後得到最大值。那不好嗎?我應該擔心這個問題,或者增加另一個索引(反轉)?或者有沒有更好的方法來創建適合這種查詢類型的索引?
在對具有非常高的I/O等待的服務器進行故障診斷時,我注意到存在來自執行SELECT max(x) FROM t WHERE y = ?
的查詢的大量I/O。向後索引掃描與索引掃描
我的指數是btree (x, y)
。
我注意到查詢計劃確實索引掃描向後得到最大值。那不好嗎?我應該擔心這個問題,或者增加另一個索引(反轉)?或者有沒有更好的方法來創建適合這種查詢類型的索引?
不,這不是壞事,從第一個索引頁開始需要相同的時間,因爲它需要從最後一個索引頁開始。使用DESC創建降序索引時,您可以看到「差異」。
索引(y,x)對於此查詢可能會更好。
索引排序,最低值在前。要查找最大值,向後索引掃描會先找到最大值:)。
我假設SELECT min(x)會導致正常的索引掃描,是嗎?
是的,min(x)進行正常掃描。 – ibz 2011-02-16 14:06:54
在(y,x)上創建索引可將查詢成本從10k降低到300並大大縮短查詢時間。有x DESC沒有任何區別。謝謝你的提示! – ibz 2011-02-17 07:05:06