2016-12-29 56 views
-1

我在分區表上創建了一個視圖。當我將分區列傳遞給SELECT語句時,優化程序在通過EXPLAIN語句檢查時不會訪問該特定分區。MySQL - 通過視圖訪問分區

有什麼辦法讓視圖訪問它的表的單個分區?

[編輯]:這是我如何創建兩個分區表

CREATE TABLE Partition1 (ID INT,NAME VARCHAR(100),DOB DATE) 
PARTITION BY LIST (YEAR(DOB)) 
(
    PARTITION P_2000 VALUES IN (2000), 
    PARTITION P_2001 VALUES IN (2001) 
); 

CREATE TABLE NOPART (ID INT,DOB DATE) 
PARTITION BY LIST (YEAR(DOB)) 
(
    PARTITION P_2000 VALUES IN (2000), 
    PARTITION P_2001 VALUES IN (2001) 
); 

CREATE OR REPLACE VIEW P_VIEW 
AS 
SELECT ID,DOB 
FROM PARTITION1 
UNION 
SELECT ID,DOB 
FROM NOPART; 

EXPLAIN 
SELECT * FROM P_VIEW 
WHERE DOB = '2001-01-01'; 

認爲當我運行的「解釋」,它顯示優化器將兩個分區「p_2000」和「p_2001」。

+0

向我們展示'show create table [partitioned table]'和'show create view [your_view]'的輸出結果,那麼我們可以告訴更多.. –

+0

請參閱上面更新了問題。 –

回答

0

執行VIEWs有很多不足之處。你可能已經命中一個。

PARTITIONing有很多用途,不提供任何性能。 BY RANGE可能是幫助某些用例的性能的唯一變體。少於一百萬行的表是不值得分區的。

沒有看到您的CREATE TABLECREATE VIEWSELECT,我們只能給你像我一樣模糊的答案。

(迴應添加的代碼)除非有其他更多的信息,PARTITIONing以這種方式提供沒有任何好處,因爲在DOB上有索引。

此外,VIEW + PARTITION方法(無索引)必須掃描整個2001分區,尋找'2001-01-01'的幾行。相反,簡單的索引方法可以立即找到它們 - 速度是365倍。 (好吧,不是那麼快,但仍然)

+0

嗨瑞克!我用示例代碼編輯了我的問題。請看看它。 –