#关于mysql分表方案
因数据表的量,达到亿级别,读写效率较低,实施分区分表方案
mysql分区
分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。 分区后,表面上还是一张表,但数据散列到多个位置了。 读写的时候操作的还是同一张表名,db自动去组织分区的数据。 分区的表和没有分区的表示一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。
MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用: Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。 Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。 Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。 List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。 Composite(复合模式) –以上模式的组合使用
分区能做什么
逻辑数据分割 提高单一的写和读应用速度 提高分区范围读查询的速度 分割数据能够有多个不同的物理文件路径 高效的保存历史数据 一个表上的约束检查 不同的主从服务器分区策略,例如master按Hash分区,slave按range分区
分区的限制(截止5.1.44版)
只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列
最大分区数目不能超过1024
如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内
不支持外键
不支持全文索引(fulltext)
按日期进行分区很非常适合,因为很多日期函数可以用。但是对于字符串来说合适的分区函数不太多
什么时候使用分区
海量数据表 历史表快速的查询,可以采用ARCHIVE+PARTITION的方式。 数据表索引大于服务器有效内存 对于大表,特别是索引远远大于服务器有效内存时,可以不用索引,此时分区效率会更有效。