通过分区(Partition)提升MySQL性能 - mysql -

通过分区(Partition)提升MySQL性能

时间:2013-07-24 12:30:04   来源:   评论:加载中...   点击:加载中...
今天这么激动又想写文章的原因是MySQL5.1的发布带来了设计超强动力数据库的强有力的武器,任何MySQL的DBA都应该尽快学习并使用它。我觉得如果&...

分区带来的好处太多太多了,有多少?俺也不知道,自己猜去吧,要是觉得没有多少就别用,反正俺也不求你用。不过在这里俺强调两点好处:

性能的提升(Increased performance) -

在扫描操作中,如果MySQL的优化器知道哪个分区中才包含特定查询中需要的数据,它就能直接去扫描那些分区的数据,而不用浪费很多时间扫描不需要的地方了。需­要举个例子?好啊,百万行的表划分为10个分区,每个分区就包含十万行数据,那么查询分区需要的时间仅仅是全表扫描的十分之一了,很明显的对比。同时对十万行的­表建立索引的速度也会比百万行的快得多得多。如果你能把这些分区建立在不同的磁盘上,这时候的I/O读写速度就“不堪设想”(没用错词,真的太快了,理论上10­0倍的速度提升啊,这是多么快的响应速度啊,所以有点不堪设想了)了。

对数据管理的简化(Simplified data management) -

分区技术可以让DBA对数据的管理能力提升。通过优良的分区,DBA可以简化特定数据操作的执行方式。例如:DBA在对某些分区的内容进行删除的同时能保证余下­的分区的数据完整性(这是跟对表的数据删除这种大动作做比较的)。

此外分区是由MySQL系统直接管理的,DBA不需要手工的去划分和维护。例如:这个例如没意思,不讲了,如果你是DBA,只要你划分了分区,以后你就不用管了­就是了。

站在性能设计的观点上,俺们对以上的内容也是相当感兴趣滴。通过使用分区和对不同的SQL操作的匹配设计,数据库的性能一定能获得巨大提升。下面咱们一起用用这­个MySQL 5.1的新功能看看。

下面所有的测试都在Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM机器上(炫耀啊……),Fedora Core 4和MySQL 5.1.6 alpha上运行通过。

如何进行实际分区,看看分区的实际效果吧。我们建立几个同样的MyISAM引擎的表,包含日期敏感的数据,但只对其中一个分区。分区的表(表名为part_tab)我们采用Ran­ge范围分区模式,通过年份进行分区:


mysql> CREATE TABLE part_tab

    ->      (  c1 int default NULL,

 ->  c2 varchar(30) default NULL,

    ->  c3 date default NULL

 ->

    ->      ) engine=myisam

    ->      PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS
THAN (1995),

    ->      PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES
LESS THAN (1997) ,

    ->      PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES
LESS THAN (1999) ,

    ->      PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES
LESS THAN (2001) ,

    ->      PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES
LESS THAN (2003) ,

    ->      PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES
LESS THAN (2010),

    ->      PARTITION p11 VALUES LESS THAN MAXVALUE );

Query OK, 0 rows affected (0.00 sec)

注意到了这里的最后一行吗?这里把不属于前面年度划分的年份范围都包含了,这样才能保证数据不会出错,大家以后要记住啊,不然数据库无缘无故出错你就爽了。那下­面我们建立没有分区的表(表名为no_part_tab):


mysql> create table no_part_tab


    -> (c1 int(11) default NULL,


    -> c2 varchar(30) default NULL,


    -> c3 date default NULL) engine=myisam;

Query OK, 0 rows affected (0.02 sec)



相关热词搜索:

 
上一篇:MySQL 5.0.16 乱码问题处理办法
下一篇:MySQL数据的导出和导入工具:mysqldump
收藏 将此文推荐给朋友
分享到: