mysql03
Posted quyangyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql03相关的知识,希望对你有一定的参考价值。
分库分表
数据切分
通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者
Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据
表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数
据的水平(横向)切分。
垂直切分
一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同
的数据库上面,这样也就将数据或者说压力分担到不同的库上面
系统被切分成了,用户,订单交易,支付几个模块。
一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的
数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统
的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。
优点
拆分后业务清晰,拆分规则明确。
系统之间整合或扩展容易。
数据维护简单。
缺点
部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度。
受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
事务处理复杂。
水平切分
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中
包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分
到一个数据库,而另外的某些行又切分到其他的数据库中
拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。
比如:
从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆
分,不同的数据按照会员 ID 做分组,这样所有的数据查询 join 都会在单库内解决;
如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡量。
几种典型的分片规则包括:
按照用户 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中。
userid%5 = 0 ,userid%5 = 1 , userid %5 =2 ,userid %5 =3 ,userid %5 =4
按照日期,将不同月甚至日的数据分散到不同的库中。
按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中
优点
拆分规则抽象好,join 操作基本可以数据库做。
不存在单库大数据,高并发的性能瓶颈。
应用端改造较少。
提高了系统的稳定性跟负载能力。
缺点
拆分规则难以抽象。
分片事务一致性难以解决。
数据多次扩展难度跟维护量极大。
跨库 join 性能较差
物理切分(表分区)
mysql数据存储位置 /var/lib/mysql
innoDB (共享表空间,独享表空间)
frm 结构文件
ibd 数据文件
MyISAM
frm 结构文件
myd 数据文件
myi 索引文件
查看表空间设置
show variables like ‘%innodb_file_per_table%‘
set global innodb_file_per_table=off
拆分策略
Range 范围
List 值
Hash 取模
Key
range
1 构建数据 2 3 create table t_base(id int primary key auto_increment,name varchar(10)); 4 insert into t_base(name) values (‘hello‘); 5 6 insert into t_base(name) select name from t_base; 7 ....... 8 9 Records: 524312 Duplicates: 0 Warnings: 0 10 11 12 13 create table t_range(id int primary key auto_increment,name varchar(10)) partition by range(id) ( 14 partition p0 values less than (100000), 15 partition p1 values less than (200000), 16 partition p2 values less than (300000), 17 partition p3 values less than (400000), 18 partition p4 values less than maxvalue 19 ); 20 21 22 insert into t_range (name) select name from t_base; 23 24 >select * from t_range limit 1; 25 1 hello 26 27 alter table t_range drop partition p0; 28 29 >select * from t_range limit 1; 30 10000 hello
list分区
1 create table t_list ( id int primary key ,name varchar(10) ) 2 partition by list(id) ( 3 partition p0 values in (1,2,3), 4 partition p1 values in (4,5,6) 5 ); 6 7 insert into t_list(id,name) values (1,‘zhangsan‘); 8 9 select * from t_list; 10 1 zhangsan 11 12 alter table t_list drop partition p0; 13 14 select * from t_list; 15 Empty set
hash
1 create table t_hash(id int primary key auto_increment,name varchar(10)) 2 partition by hash(id) partition 4;
完
以上是关于mysql03的主要内容,如果未能解决你的问题,请参考以下文章