首页 > 数据库 > MySQL 5.1 分区技术初探(二)

MySQL 5.1 分区技术初探(二)

2011年12月30号
查看评论 发表评论 152次浏览

  MySQL分区技术是用来减轻海量数据带来的负担,解决数据库性能下降问题的一种方式,其他的方式还有建立索引,大表拆小表等等。

  MySQL分区按照分区的参考方式来分有RANGE分区、LIST分区、HASH分区、KEY分区。本文对这几种分区方式进行了详细的介绍,并且给出了简单的示例,文章简洁明了,对于想要初步了解MySQL分区技术的同学来说是很不错的参考材料。


三、案例分析

  这个案例是针对有个员工、部门、部门经理、头衔和销售记录的模拟数据,其ER图如下所示,数据量大概有4百万左右。数据下载URL:https://launchpad.net/test-db

  

图11,案例分析

  通过如上可知,对于同样的数据按照分区和不分区的技术分别存储,从而便于如下的查询性能分析和对比。对于salaries表,它采用RANGE分区,定义如下:

  

图12,案例分析

  1,单表查询

  从销售记录中找到1999年整年的销售记录有多少条,这个很简单,查询语句如下:

  select count(*) from salaries s where s.from_date between”1999-01-01″ and “1999-12-31″ ;

  那么对于分区前后的查询性能却有很大的差别:

  

图13,分区前后查询性能对比

  通过如上可知,利用分区之后它只需扫描p16分区,访问的记录明显减少,所以性能自然有较大的提升:

图14,无采用分区技术和采用分区技术性能对比

  2,单表查询的badcase

  若现在有如下查询:

  select count(*) from salaries s where year(s.from_date)=1999;

  那么它是否能够利用到分区技术呢,答案是否定的。为什么呢,因为分区中的key是s.from_date,而不是year(s.from_date),mysql并不能很智能地判断year是1999的,那么它就是分为p16分区,这个可以通过如下的查询计划可以证实:

  

图15,未优化前的单表查询

  也就是其实它访问了所有的分区,所以并没有很好地利用分区功能,将SQL改写如下:

  select count(*) from salaries s where year between ’1999-01-01′ and’1999-12-31′ ;

  则查询计划如下:

图16,改进后的单表查询

  可知,书写正确的SQL可以完全表现出两种相差特别大的性能。

页面: 1 2

类别数据库 标签
  1. 目前没有评论
你必需 登陆 才能发表评论.