文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>每日学习笔记(14)

每日学习笔记(14)

时间:2011-04-03  来源:Phinecos(洞庭散人)

今天在读《MySQL技术内幕InnoDB存储引擎》,作者在第四章讲到MySQL的分区时提到了一个问题,“对数据表分区真的会提高数据库的查询性能吗?”。

对于OLAP的应用,分区的确可以很好地提高查询的性能,因为OLAP应用中大多数查询需要频繁地扫描一张很大的表。假设表中数据有1亿行,其中有一个时间戳属性列。你的查询需要从这张表中获取一年的数据。如果按数据戳进行分区,则只需要扫描相应的分区就可以了。

对于OLTP 的应用,分区则应该非常小心。在这种应用下,不可能会获取一张大表中10%的数据,大部分都是通过索引返回几条记录就可以了。而根据B+树索引的原理可知,对于一张大表,一般的B+树需要2~3次得磁盘IO。因此B+树可以很好地完成操作,不需要分区的帮助,而且设计不好的分区反而会带来严重的性能问题。

假设一张表有1000万行数据,如果对主键做10个HASH的分区,那么每个分区就只有100万行数据。看上去对主键进行查询的速度是应该会变快了,例如Select * from table where PK=@pk。但是你有没有考虑过这样一个问题:100万行和1000万行的数据本身构成的B+树层次都是一样的,可能都是2层?那么上述走主键分区的索引并不会带来性能的提高。好吧,即时1000万行的B+树高度是3,100万行的B +树高度是2,那么上述方法可以避免1次IO,从而提高查询的效率。恩,这没有问题,但是这张表只有主键索引,而没有其他的列需要查询吗?如果有如下的语句:select * from table where key=@key,此时对于key的查询就需要扫描所有的10个分区,即使每个分区的查询开销为2次IO,那么也需要20次IO。而对于原来的单表设计,对于Key的查询还是2~3次IO.

因此,对于使用InnoDB存储引擎作为OLTP应用的表,在使用分区时应该十分小心,设计时要确认数据的访问模式,否则分区不仅不会带来查询速度的提高,反而可能会使你的应用执行速度变慢。

 

相关阅读 更多 +
排行榜 更多 +
ooxe官方版下载

ooxe官方版下载

金融理财 下载
ooxe

ooxe

金融理财 下载
OXE交易app安卓版下载

OXE交易app安卓版下载

金融理财 下载