Mysql 表分区和性能
以下内容节选自<Mysql技术内幕InnoDB存储引擎>
mysql表分区:
分区功能并不是所有存储引擎都支持的,如CSV、MERGE等就不支持。mysql数据库支持的分区类型为水平分区(指一张表中不同行的记录分配到不同的物理文件中),不支持垂直分区(指将同一表中的不同列分配到不同的物理文件中)。此外,mysql数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。
当前Mysql数据库支持以下几种类型的分区:
Range分区:行数据基于一个给定连续区间的列值放入分区。Mysql数据库5.5开始支持Range Columns分区。
List分区:和Range分区类似,只是List分区面向的是离散的值。Mysql数据库5.5开始支持List Columns分区。
Hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。
Key分区:根据Mysql数据库提供的哈希函数来进行分区。
分区和性能:
数据库应用分为两类:一类是OLTP(在线事务处理),如博客、电子商务、网游等;另一类是OLAP(在线分析处理),如数据仓库、数据集市。
对于OLAP的应用,分区的确可以很好的提高查询性能,因为OLAP应用的大多数查询需要频繁的扫描一张很大的表,如果进行分区则只需要扫描相应的部分即可。
而对于OLTP应用一般情况下不可能获取一张大表中10%的数据,大部分都是通过索引返回若干记录。对于一张大表,一般的B+树需要2~3次磁盘IO。举个列子,一张数据量为1000万行的表B+树高度为3,将他分为10个区,100万行的B+树高度是2。单独对于Key索引的查询在基于分区设计的情况下查询开销为2次IO,而原表设计需要2到3次IO。而如果对于其他列索引的查询就可能需要10 * 2 = 20次IO。分区查询耗时将远远大于没有进行分区设计数据表的查询耗时。
结论:
分区并不适用于所有的应用,应该根据实际情况规划自己的分区设计。