2013-01-31 19 views
2

我有一個數據庫按to_days(created_at)的範圍分區。MySQL分區修剪總是包含不等式查詢中的第一個分區

分區是每月(p1-p50),最後是pmax catchall。在下面的例子中,我期待只有分區p45被擊中。

當我做一個解釋分區選擇*從所在單位created_at> 「2013-01-01 00:00:00」 和NOW()

我得到P1,P45分區列下列

5.1和5.5都會發生這種情況

爲什麼優化器包含不等式檢查的第一個分區?

回答

2

你問這個是很久以前,但我也遇到了這個問題,並在這裏找到了一個解決辦法:

http://datacharmer.blogspot.com/2010/05/two-quick-performance-tips-with-mysql.html

...基本上你應該創建一個包含值小於第一分區( 0),這將永遠是空的。 MySQL查詢優化器仍然會包含這個第一個分區,但至少它不應該進行任何資源密集型掃描。

更新:這是我原來的答覆鏈接的URL的簡短摘要:

MySQL官方的錯誤追蹤承認這種行爲爲特徵:

錯誤描述:

無論範圍的BETWEEN子句由RANGE使用TO_DAYS函數分區的表總是在修剪時包含表中的第一個分區。

響應:

這是不是一個錯誤,因爲TO_DAYS()返回NULL無效的日期,它需要掃描的第一個分區以及(因爲保存所有NULL值)範圍。

...

績效的解決方法是創建一個特定的分區來容納所有空值(如「...小於(0)」),這也將捕獲所有劣棗。

+0

你可以添加更多關於鏈接所說的情況的摘要嗎? – DanM7