1.1 什么是同义词
Oracle synonym 同义词是数据库当前用户通过给另外一个用户的对象创建一个别名,然后可以通过对别名进行查询和操作,等价于直接操作该数据库对象。Oracle同义词常常是给表、视图、函数、过程、包等制定别名,可以通过CREATE 命令进行创建、ALTER 命令进行修改、DROP 命令执行删除操作。
CREATE [OR REPLACE] [PUBLIC] SYSNONYM [当前用户.]synonym_nameFOR [其他用户.]object_name;
MySQL数据库中不存在同义词
1.2 同义词类型
1.2.1 共有同义词(public synonym)
公有同义词只能具有DBA用户才能进行创建,所有用户都可以访问的。
1.2.2 私有同义词(private synonym)
私有同义词只能当前用户可以访问,前提:当前用户具有create synonym 权限
1.3 同义词作用
oracle中对用户的管理是使用权限的方式来管理的,当前用户要使用数据库必须要有权限,有权限对表进行的操作时必须在表的前面所有者的名称,如select * from user1.table1,当我们建一个同义词后可以直接使用select * from table1对数据库表进行操作。
Ø 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。
Ø 为用户简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。
Ø 为分布式数据库的远程对象提供位置透明性。
2 分区(partitIOn)2.1 什么是分区
数据分区是物理数据库的一种设计技术,他是通过将数据存储在不同物理数据页中,在特定SQL操作时减少数据读写的总量、提到IO并发、降低IO压力从而达到缩减响应时间的一种技术。
分区后的数据在逻辑上还是一个表,而不会生成新的数据表。分区后会将表里的数据根据分区策略分散到不同的硬盘、系统或者外挂存储介质中。
mysql5 开始支持分区功能
2.2 分区的优缺点
2.2.1 优点
Ø 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用
Ø 维护方便:可以单独备份和恢复每个分区。如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 节约维护时间,单个分区的数据装载,索引重建,备份,维护等将远小于整张表的维护时间
Ø 均衡I/O:将不同的分区映射到不同的磁盘以平衡I/O,提高并发,改善整个系统性能。
Ø 改善查询性能:只需要搜索特定分区,而非整张表,提高查询速度
Ø 相对于单个文件系统或是硬盘,分区可以存储更多的数据
2.2.2 特点
Ø 已经存在的表没有方法可以直接转化为分区表,不过 Oracle 提供了在线重定义表的功能
Ø 包含LONG、LONGRAW数据类型的表不能分区
Ø 每个分区相对独立,可以有自己物理属性pctfree、pctused、tablespace
2.3 分区类型
以oracle11g为例进行说明
2.3.1 哈希分区hash
这类分区是在列值上使用哈希算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散哈希分区。
哈希分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。
CREATE TABLE emp ( empno NUMBER (4), ename VARCHAR2 (30), sal NUMBER ) PARTITION BY HASH (empno) PARTITIONS 8 --表空间的数量 STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);--表空间的名称 CREATE TABLE HASH_TABLE ( COL NUMBER(8), INF VARCHAR2(100) ) PARTITION BY HASH (COL) ( PARTITION PART01 TABLESPACE HASH_TS01, PARTITION PART02 TABLESPACE HASH_TS02, PARTITION PART03 TABLESPACE HASH_TS03 )
2.3.2 范围分区range
Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中
· 1、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
· 2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
· 3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值
create table r
(a int)
partition by range (a)
(
partition p1 values less than (10),
partition p2 values less than (20),
partition p3 values less than (30),
partition p4 values less than (maxvalue)
);
select * from r partition (p1) --查看分区中的数据
2.3.3 列表分区list
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。
create table custaddr ( id varchar2(15 byte) not null, areacode varchar2(4 byte) ) partition by list (areacode) ( partition t_list025 values ('025'), partition t_list372 values ('372') , partition t_list510 values ('510'), partition p_other values (default) )
2.3.4 组合分区
10g中有两种:range-hash,range-list。11g中有四种:
2.3.4.1
2.3.5 Interval Partitioning
数据库管理员日常要做的一件重复而无聊的工作 比如每隔一天要生成新的24个分区,用以存储第二天的数据。而在11g中这项工作可以交由Oracle自动完成了,基于Range和List的Interval Partitioning分区类型登场。
在 11g 里的 Interval 创建,这种方法对没有写全的分区会自动创建。 比如我
这里只写了 1 月日期,如果插入的数据有其他月份的,会自动生成对应的分区。
CREATE TABLE TB_INTERVAL PARTITION BY RANGE (time_col) INTERVAL(NUMTOYMINTERVAL(1, 'month')) (PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2016', 'dd-mm-yyyy')));
2.4 分区操作
2.4.1 添加分区
添加新的分区有 2 中情况: ( 1)原分区里边界是 maxvalue 或者 default。 这种情况下,我们需要把边界分区 drop 掉,加上新分区后,在添加上新的分区。 或者采用 split,对边界分区进行拆分。 ( 2)没有边界分区的。 这种情况下,直接添加分区就可以了。 ALTER TABLE table_name add partition partition_name values less than (xxx ) tablespace xx;
2.4.2 合并分区
相邻的分区可以 merge 为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区, 原先的局部索引相应也会合并,全局索引会失效,需要 rebuild。
alter table sales3 merge partitons sp1,sp3 into partition sp3
2.4.3 移动表空间
alter table table_name move partition p1 to tablespace tp;
分区移动会自动维护局部分区索引, oracle 不会自动维护全局索引,所以需要我们重新 rebuild 全局索引,主键默认是全局索引。
2.4.4 添加子分区
alter table T_TRACK modify partition P_2005_01 add subpartition P_2005_01_P1017 values('P1017'); 3 分表
3.1 什么是分表
分表就是把一个表按照一定规则分解成多个具有独立空间的实体表,操作时需要根据规则索引到具体的表。分表后数据被分散到不同的物理介子中,跟分区一样,可减少特定SQL操作的加载的数据页、提到IO并行、提到IO性能。
3.2 分表的优缺点
Ø 数据分布到不同的物理介质,IO性能提到
Ø 读写锁影响的数据行减少
Ø 表数据减少、表的索引数据量减少,索引效率更高
Ø 会涉及到应用改造,实现难度较大
3.3 分区和分表的区别与联系
Ø 分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
Ø 分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
Ø 当访问量大,且表数据比较大时,两种方式可以互相配合使用。
Ø 当访问量不大,但表数据比较多时,可以只进行分区。
4 分库4.1 什么是分库
分库是将数据按照一定的规则存储到不同的服务器中,以达到降低单台服务器压力,提高SQL操作性能的目的。分库一般分为水平分库、垂直分库。
4.2 分库类型
Ø 垂直分库:不同数据库存储不同模块的不同表,从而达到降低整个数据库数据总量的目的,无法解决单表压力过大的问题。存在跨数据库的事务、jion查询等问题
Ø 水平分库:不同库的相同表的数据根据一定规则分散到不同数据库中,使压力分散到不同服务器。存在数据路由、组装、跨数据库的事务、jion查询等问题
4.3 分库的优缺点
Ø 降低单台服务器IO压力、网络压力,从而突破单服务器性能瓶颈,解决数据库扩展性问题
Ø 实现读写分离
Ø 事务的支持,分库分表,就变成了分布式事务,因此存在分布式事物问题
Ø join时跨库,跨表的问题
Ø 分库分表,读写分离使用了分布式,分布式为了保证强一致性,必然带来延迟,导致性能降低,系统的复杂度变高。
4.4 分库与分表的区别
Ø 分表和分库都是通过把数据分散到不同存储介质中,从而达到提到IO并行、降低IO压力,提到SQL效率的目的。
Ø 分库是后数据一般存储到不同服务上,因此可以突破单机瓶颈,如网络带宽、单机IO。而分表无法解决这些问题。
5 分片https://blog.csdn.net/weixin_38074050/article/details/78640004
5.1 什么是分片
分片(sharding)是指通过一定规则,将存储在数据库中的数据分散到不同数据库,以达到分散单台设备负载的效果的技术,对于业务透明。一般选用第三方的数据库中间件(Atlas,Mycat,TDDL,DRDS)
5.2 分库与分片的区别
Ø 分片是实现分库的技术,分库是最终目的。
5.3 分片概念
5.3.1 逻辑库
在分布式数据库中,分片对于业务透明,数据分散到不同物理库中,但从逻辑上仍然是同一个库,因此数据库中间件可以看成是一个或多个物理库组成的逻辑库。
5.3.2 逻辑表
逻辑库中对应的表为逻辑表,具体的实体表被分散在单个或者多个分片节点中,对于应用来说操作的是一个逻辑表。
5.3.3 分片表
分布式数据库中,对于切分到不同节点的表称为分片表。
5.3.4 单片表
分布式数据库中,如果一个表只切分到一个分片节点中,则这个表为单片表
5.3.5 全局表
分布式数据库中,如果一个表在每个分片节点中都存在,则这个表为全局表,全局表一般是数据量比较小或者需要频繁进行join关联查询的规格表。
5.3.6 分片节点
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)
5.3.7 节点主机
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
5.3.8 分片规则
分布式数据库中一个逻辑表的数据根据事先设置的规则切分到不同的分片节点中,这个规则就是分片规则,分片规则中会设置分片表、分片字段、分片节点、分片算法等信息