2016-12-29 73 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

嗨瑞克!我用示例代码编辑了我的问题。请看看它。 –