SELECT * FROM t1 WHERE system_type IN (1,2) UNION ALL SELECT * FROM t1 WHERE system_type = 3; 这条语句对system_type字段过滤了两次,然后进行了一次UNION ALL。 但是不知道,其实对两个分区一共进行了三次全表扫描。我改成这样:SELECT * FROM t1 WHERE system_type IN (1,3) UNION ALL SELECT * FROM t1 WHERE system_type = 2;
id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 r0,r1 ALL N N N N 17719 Using where现在,依然是范围扫描,但是上下限就很明了了。这样对扫描分区来说,很快的找到上下限,比之前来的要快,开销来的要小点了。 但是貌似还可以优化, 虽然过滤条件的上下限明显了,但是对于区域之内的扫描还是全分区(相当于整个表的全表。)。 OK,那现在给这个列加上索引吧。
ALTER TABLE t1 ANALYZE PARTITION r0,r1;
SELECT * FROM t1 WHERE system_type in(1,2,3);
id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 r0,r1 range NewIndex1 NewIndex1 1 N 6462 Using where