★针对海量数据的优化主要有两种方法
(1)大表拆成小表
垂直分表(竖切)---主键在每个分表中都会出现
水平分表(横切)---字段一般稳定,而记录不稳定
水平分表技术是将一个表拆分成多个表,比较常用的方式是将表中的记录按照某种Hash算法进行拆分,简单的拆分方法如取模方式。同样,这种分区方法也必须对前端的应用程序中的SQL进行修改方可使用。而且对于一个SQL,它可能会修改两个表,那么必须得写成2个SQL语句从而可以完成一个逻辑事务,使得程序的逻辑判断越来越复杂,这也会导致程序的维护代价增高,也就失去了采用数据库的优势。因此,分区技术可以有利地避免如上的弊端,成为解决海量数据的有利方法
(2)SQL语句的优化
可以通过增加索引等来调整,但是数据量的增大同时也会导致索引的维护代价增大
★mysql分区技术不同于之前的分表技术,它与水平分表有些类似,但是它是在逻辑层进行的水平分表,对于应用程序而言它还是一张表
RANGE分区:基于属于一个给定的连续区间的列值,把多行分配给分区
PARTITION BY RANGE(store_id)(
PARTITION p0 VALUES LESS THAN(6), 编号1-5的店铺存放在p0分区(< 6)
PARTITION p1 VALUES LESS THAN(11), 编号6-10的店铺存放在p1分区
PARTITION p2 VALUES LESS THAN(16), 编号11-15的店铺存放在p2分区
PARTITION p3 VALUES LESS THAN(21), 编号16-20的店铺存放在p3分区
)
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值进行选择
PARTITION BY LIST(store_id)
(
PARTITION pNorth VALUES IN(3,5,6,9,17),
PARTITION pEast VALUES IN(1,2,10,11,19,20),
PARTITION pWest VALUES IN(4,12,13,14,18),
PARTITION pCentral VALUES IN(7,8,15,16),
)
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算,这个函数可以包含mysql中有效的、产生非负整数值的任何表达式(平均分配到每个分区,但可能分区与分区之间的数据没有规律)
PARTITION BY HASH(YEAR(hired))
PARTITIONS 4
;
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,并且mysql服务器提供其自身的HASH函数
★不同分区技术的对比
分区类型 优点 缺点 共性
RANGE 适合日期类型支持复合分区 有限的分区 一般只针对某一列
LIST 适合有固定取值的列支持复合分区 有限的分区,插入 一般只针对某一列
记录在这一列的值不在
LIST中,则数据丢失
HASH 线性HASH使得增加、删除和合并分 线性Hash的数据分布不 一般只针对某一列
区更快捷 均匀而一般Hash数据分
布较均匀
KEY 列可以为字符型等其他非Int类型 效率较之前的低,因为 一般只针对某一列
函数为复杂的函数
(如.MD5或SHA函数)
原文地址:http://caoyue.blog.51cto.com/9876038/1631289