MySQL 5.1 分区技术初探(二)
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