当前位置:  首页  >  PHP教程  >  PHP 基础  >  环境

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

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

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

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

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


我们的表结构如下:

这里已经插入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 < 4;


去掉了UNION ALL,但是遇到的问题是对分区的扫描变成了?#27573;?#26597;找,而且上下限不固定,相对来说,还有优化的空间。


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


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






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

ALTER TABLE t1 ANALYZE PARTITION r0,r1;


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











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

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

吐了个 "CAO" !
扫码关注 PHP1 官方微信号
PHP1.CN | 中国最专业的PHP中文社区 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | PHP问答
Copyright ? 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有
     
28玩法
四川体育彩票走势图 河北20选5开奖结果 玩呗有什么技巧 七星彩三定位包码 欢乐斗牛牛 11选5技巧稳赚前三直 双色球玩赚尾号 11选5复式投注表 彩票有人拉我合买 王中王资料一肖中特管家婆 湖北30选5开奖信息 bte365正规网站 p62历史开奖号码 香港赛马会六肖中特 2019第120期码报图