MySQL的分表和分区介绍

  

    在日常开发或维护中经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

    分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。


  把一个数据量很大的表,根据某个字段的属性或使用频繁程度分类拆分为多个表,或者把一个业务系统的库分到不同的实例上。

MySQL的分表和分区介绍

  根据一列或者多列的值把数据行放到多个独立的表里,水平分表方式可以通过多个低配置主机整合起来,实现高性能。

MySQL的分表和分区介绍

  

    水平优点:拆分规则抽象好,JION操作基本可以数据库做,不存在单表大数据、高并发的性能瓶颈,应用端改造较少,提高系统的稳定性和负载能力


    缺点:分片事务一致性难以解决,在MyCAT2.0之前MySQL5.7之前,还是数据弱XA。数据多次扩展难度维护量大,夸库JOIN性能差


    垂直优点:拆分后业务清晰,拆分规则明确,系统之间整合或者拓展容易,数据库维护简单

    缺点:部分业务无法使用JOIN,只能通过接口方式解决,提供系统能够复杂度,受每种业务不同的限制存在性能瓶颈,不容易数据扩展跟性能提高。

    事务处理复杂,垂直切分后按照业务的分类将表分散到不同的库,会导致有些业务表过于庞大,存在单库读写与存储瓶颈。



    分区就是把一张表的数据分成N多个区域,分区后,表面上还是一张表,但数据散列到多个位置根据数据量的大小,结合实际业务

    主要用于时间列分区、值范围,行数据基于一个给定连续分区的列值放入分区。如销售类的表,可以根据年来分区存放销售记录

    面向离散的值,分区要指定的值,当插入指定的数据到指定分区表去,如指定某些值在特定分区里。

    类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

    :基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。



      如果表中存在主键或是唯一索引时,分区列必须是唯一索引的一个组成部分
  唯一索引,,,,,
  ,create  table  t11 (
  ,,,,,col1  int  not 空,
  ,,,,,col2  date  not 空,
  ,,,,,col3  int  not 空,
  ,,,,,col4  int  not 空,
  ,,,,,unique  key  (col1, col2))
  ,,,,,partition  by 哈希(col1)
  ,,,,,partitions  4;
  ,哈希,,,,,
  create  table  t121 (
  ,,,,,col1  int  not 空,
  ,,,,,col2  date  not 空,
  ,,,,,col3  int  not 空,
  ,,,,,col4  int  not 空,
  ,,,,,unique  key  (col1, col2))
  ,,,,,partition  by 哈希(col2)(年)
  ,,,,,partitions  4;
  主键
  create  table  t31 (
  ,,,,,col1  int  not 空,
  ,,,,,col2  date  not 空,
  ,,,,,col3  int  not 空,
  ,,,,,col4  int  not 空,
  ,,,,,primary  key  (col1, col2))
  ,,,,,partition  by 哈希(col1)
  ,,,,,partitions  8;
  主键和索引同时存在:
  create  table  t41 (
  ,,,,,col1  int  not 空,
  ,,,,,col2  date  not 空,
  ,,,,,col3  int  not 空,
  ,,,,,col4  int  not 空,
  ,,,,,unique 关键(col4),
  ,,,,,primary  key  (col1))
  ,,,,,partition  by 哈希(col1)
  ,,,,,partitions  5;
  
  ,,,,,唯一索引可以允许是null值,分区列只要是唯一索引的一个组成部分,不需要整个唯一索引列都是分区列
  create  table  t223332 (
  col1  int 空,
  col2  date 空,
  col3  int 空,
  col4  int 零)
  partition  by 哈希(col3)
  partitions  4;
  ,,,没有主键或唯一索引,可以指定任何一个列为分区列
  create  table  t223332 (
  col1  int 空,
  col2  date 空,
  col3  int 空,
  col4  int 空,
  键(col4))
  partition  by 哈希(col3)
  partitions  4;
  ,,,rang 分区:主要用于时间列分区,如销售类的表,可以根据年来分区存放销售记录
  ,,,定义:行数据基于一个给定连续分区的列值放入分区,
  ,,,,,,id 是主键
  ,,,create  table  t3 (
  ,,,=innodb id  int)引擎
  ,,,partition  by 范围(id) (
  ,,,partition  p0  values  less  than  (10),
  ,,,partition  p1  values  less  than  (20)
  ,);
  ,,,查看数据文件
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

MySQL的分表和分区介绍