【原创】基于MySQL 水平分区的优化示例

我们知道,MYSQL5.1开始支持水平分区功能。我们来尝试下如何在已经分区的表上面做查询优化。总体来说,优化的原则和对单独的表做优化是一样的,保证对磁盘上表的

   我们知道,mysql 5.1开始支持水平分区功能。 我们来尝试下如何在已经分区的表上面做查询优化。

总体来说,优化的原则和对单独的表做优化是一样的,保证对磁盘上表的扫描次数减小。

我们的表结构如下:

 

爱克网络企业网站建设系统 No.090730 爱克网络企业网站建设系统 No.090730

系统特点:功能简洁实用。目前互联网上最简洁的企业网站建设系统!原创程序代码。非网络一般下载后修改的代码。更安全。速度快!界面模版分离。原创的分离思路,完全不同于其他方式,不一样的简单感受!搜索引擎优化。做了基础的seo优化。对搜索引擎更友好系统功能关于我们:介绍企业介绍类信息,可自由添加多个介绍栏目!资讯中心:公司或行业资讯类内容展示。可自由添加多个资讯内容!产品展示:支持类别设置,可添加产品图片

爱克网络企业网站建设系统 No.090730 0 查看详情 爱克网络企业网站建设系统 No.090730

【原创】基于MySQL 水平分区的优化示例

 

这里已经插入2W多行数据进行测试。

看看这条查询。

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,但是遇到的问题是对分区的扫描变成了范围查找,而且上下限不固定,相对来说,还有优化的空间。

我们改下对system_type列的过滤条件,变成如下:

SELECT * FROM t1 WHERE system_type in(1,2,3);

现在,依然是范围扫描,但是上下限就很明了了。这样对扫描分区来说,很快的找到上下限,比之前来的要快,香港服务器租用,开销来的要小点了。
但是貌似还可以优化, 虽然过滤条件的上下限明显了,但是对于区域之内的扫描还是全分区(相当于整个表的全表。)。 
OK,那现在给这个列加上索引吧。

 

【原创】基于MySQL 水平分区的优化示例

ALTER TABLE t1 ANALYZE PARTITION r0,r1;

SELECT * FROM t1 WHERE system_type in(1,2,3);

当然,我们的例子非常简单, 这里只是为了演示下在水平分区下如何进行SQL优化。

 

本文出自 “上帝,咱们不见不散!” 博客,网站空间,香港服务器租用,请务必保留此出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/838128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月27日 11:16:02
下一篇 2025年11月27日 11:26:54

相关推荐

发表回复

登录后才能评论
关注微信