把表分区,可是还在同一台服务器上,
html
分区是将数据分红多个位置上,分红多张表,实际是一张逻辑表(是虚表),被分红了多张表,可是管理的时候能够按照管理一张表的时候管理。前端
分区在逻辑上是同一张表,分表的话,每一张表是独立的node
如下是三种常见的分区方法:mysql
能够按range(范围)切分,如1--10万行或者时间范围sql
按hash值切分:取模shell
按list(列表)来切分:如华东片区或者华北片区数据库
分区相关选项查看以下,分区要是主键或者是主键的组成部分后端
MariaDB [(none)]> help create table;中的选项partition_options就是分区的选项,partition_definition为分区的选项数组
例子服务器
例一:根据范围(值大小)分区
如下语句表示一张students表建立成三个分区
通常从最小的数值开始定义,这里有个默认的内建变量maxvalue,为该表的最大值
MariaDB [sunny]> create table testpartition (id int,name varchar(100),age tinyint unsigned not null,gender enum('F','M')) partition by range(age)(partition youngman values less than (40),partition middleman values less than (60),partition oldman values less than maxvalue);
用desc查看表的结构为一张表
MariaDB [sunny]> desc testpartition;
在shell命令执行
[root@node71 mysql]#cd /var/lib/mysql/sunny
能够看到对于表testpartition有三个单独的表空间,即三个testpartition.*ibd的文件,可是表结构只有一个,即testpartition.frm
对shell命令下,生成一组随机值,插入testpartition表里
定义gender数组
[root@node71 sunny]#gender=('F' 'M')
定义数组
插入1000行数据,注意外部使用双引号,sql语句内使用单引号
[root@node71 sunny]#for i in {1..1000};do mysql -uroot -pPass1234 -e "insert into sunny.testpartition values ($i,'stud$i',$[$RANDOM%80+18],'${gender[$RANDOM%2]}');";done;
此时,在sunny.testpartition生成1000条记录
经过这个例子,咱们能够得出结论是,虽然咱们经过范围进行了表切分,可是咱们是对同一张表进行操做。可是这1000条记录是被分割到不一样的表空间里进行存储
验证,以下命令,能够看到 testpartition#P#middleman.ibd,testpartition#P#oldman.ibd和testpartition#P#youngman.ibd已经有大小
[root@node71 sunny]#ll /var/lib/mysql/sunny -h
例二:根据id值hash后进行分区
注意,要指定分区数量,如如下partitions 5表示对5进行取模,即分红5个区,注意hash字段的类型,字符类型如char或者varchar不能被hash,由于须要填充多余的类型,这样的字段不能被hash
MariaDB [sunny]> create table hashpartition (id int,name varchar(100) not null,age tinyint unsigned,gender enum ('F','M')) partition by hash(id) partitions 5;
在路径/var/lib/mysql/sunny下生成5个表空间
hashpartition#P#p0.ibd -- hashpartition#P#p4.ibd
例三:根据列表划分
假设表listpartition有一个字段majorid,有九个值,为1--9,根据majorid进行列表分区
MariaDB [sunny]> create table listpartition (id int,name varchar(100) not null,age tinyint unsigned,gender enum ('F','M'),majorid tinyint unsigned not null) partition by list(majorid) (partition p0 values in (1,4,7),partition p1 values in (2,5,8),partition p2 values in (3,6,9));
那么majorid 为1,4,7三个值的数据会被分配到listpartition#P#p0.ibd里
majorid 为2,5,8三个值的数据会被分配到listpartition#P#p1.ibd里
majorid 为3,6,9三个值的数据会被分配到listpartition#P#p2.ibd里
到此,表分区介绍完成。
若是表分区还不能解决性能的问题,建议考虑分表或者是分库
分库的缘由
服务器面临大量写操做而没法负载,解决方案以下
1.分库:如用户信息放在一个库上,购物信息放在另外一个库上
2.分库不能解决的话,就经过路由设备,将大量的写请求分散到后端的服务器上,将同一个用户的信息都发到同一服务器上,可使得同一用户快速查看到全部的订单。
节点级的的冗余:每个主机后端有多个从服务器,用来分散读操做,下降压力,所以,每个主服务器就是一个集群。当主服务器异常时,后端的从服务器直接选举出新的主服务器
数据级的冗余:当用户请求到来时,每个节点上作数据存放的槽,如每一个节点作四个槽,每个槽就是数据存放单位,每个槽都有一个id,当用户请求过来时,对槽进行取模,将命中槽的请求发往对应的槽。注意,这里能够对槽进行备份,每个槽都有副本进行冗余,副本能够放在另外一个服务器上空闲的槽位上,当任何一个服务器异常,也不会影响数据,对槽取模能够保证数据读取的均衡请求。每一个槽上的数据称为数据片。分片能够实现分散写操做。分片的架构中,前端的路由设备很关键,在分片级别作冗余,每个分片的副本能够提供读操做。可是分片技术比较复杂。正常状况下,一个站点一般有三层:内容,业务,数据层。随着业务规模的增长,迭代增长,修改架构。
分表的缘由
分表将大表分解成若干个实例的表,每个表是独立可用。
当一张的数据达到几百万时,你查询一次所花的时间会变多,若是有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减少数据库的负担,缩短查询时间。
根据我的经验,mysql执行一个sql的过程以下:
1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果。在这个执行过程当中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,确定有sql在执行。因此咱们要缩短sql的执行时间。
mysql中有一种机制是表锁定和行锁定,为何要出现这种机制,是为了保证数据的完整性,我举个例子来讲吧,若是有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是否是二个sql均可以同时修改这条数据呢?很显然mysql对这种状况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示大家都不能对这张表进行操做,必须等我对表操做完才行。行锁定也同样,别的sql必须等我对这条数据操做完了,才能对这条数据进行操做。若是数据太多,一次执行的时间太长,等待的时间就越长,这也是咱们为何要分表的缘由。
过于表分区,分表,分库的区别,建议查看博客:https://www.cnblogs.com/langtianya/p/4997768.html
更多关于表分区的内容,建议查看博客:http://blog.51yip.com/mysql/949.html