MySQL中怎么实现水平分区

68次阅读
没有评论

共计 1086 个字符,预计需要花费 3 分钟才能阅读完成。

自动写代码机器人,免费开通

MySQL 中怎么实现水平分区,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

表结构如下:

查询。
 
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;
 
看似简简单单的改变,我们把对两个分区的扫描从三次减少到了两次。但是这样,开销也很大,能不能把 UNION ALL 去掉呢?当然可以。
 
SELECT * FROM t1 WHERE system_type 0 and system_type
 
去掉了 UNION ALL,但是遇到的问题是对分区的扫描变成了范围查找,而且上下限不固定,相对来说,还有优化的空间。
  www.2cto.com  
我们改下对 system_type 列的过滤条件,变成如下:
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 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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1086字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)