2020.9.8个人知识点温习
3.11 数据库锁
一个是悲观锁,一个是乐观锁。
悲观锁,从数据开始更改时就将数据锁住,知道更改完成才释放。
悲观锁一般就是我们通常说的数据库锁机制,。
3.12 分区分表
1、 什么是份表分区
什么是分表,从表面意思上看呢,就是把一张表分成 N 多个小表。
什么是分区,分区呢就是把一张表的数据分成 N 多个区块。
2、mysql 分表和分区有什么区别呢
1>、实现方式上
a) mysql 的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表
b) 分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表。
2>、数据处理上
a)分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。
b)分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块, 分区后的表呢,还是一张表。数据处理还是由自己来完成。
3>、提高性能上
a) 分表后,单表的并发能力提高了,磁盘 I/O 性能也提高了。
3.mysql 分表的三种方法
1>,mysql集群虽然它不是实际意义上的分表,但是它起到了分表的作用。
2>,预先估计会出现大数据量并且访问频繁的表,将其分为若干个表
3>,利用 merge 存储引擎来实现分表
4. 分区类型
range 分区:基于一个给定的连续区间范围,把数据分 配到不同的分区
list 分区:类似于 range 分区,区别在于 list 分区是居于枚举出的值列表分区,range 是基于给定的连续区间范围分区
hash 分区:基于给定的分区个数,把数据分配到不同的分区
key 分区:类似于 hash 分区
3.13 应该使用哪一种方式来实施数据库分库分表,这要 看数据库中数据量的瓶颈 所在,并综合项目的业务类型进 行考虑。
如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、 低 耦合,那么规则简单明了、容易实施的垂直切分必是首选。
而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况 之 下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属 于一体的数 据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数 据平均和负载平均, 后期也将对项目人员及应用程序产生额外的数据管理负担。
单库多表 :
随着用户数量的增加,user 表的数据量会越来越大,当数据量达到一定 程度的时 候对
user 表的查询会渐渐的变慢,从而影响整个 DB 的性能。
多库多表 :
随着数据量增加也许单台 DB 的存储空间不够,随着查询量的增加单台数据 库服 务器已经没办法支撑。这个时候可以再对数据库进行水平区分。
3.14 mysql 读写分离
在实际的应用中,绝大部分情况都是读远大于写。Mysql 提供了读写分离 的机制, 56 / 196 所有的写操作都必须对应到 Master,读操作可以在 Master 和 Slave 机 器上进行,Slave 与 Master 的结构完全一样,一个 Master 可以有多个 Slave,甚 至 Slave 下还可以挂 Slave,通 过此方式可以有效的提高 DB 集群的每秒查询率. 26 所有的写操作都是先在 Master 上操 作,然后同步更新到 Slave 上
3.15 MySQL SQL 语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行 全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用 索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引 而进行全表扫描。
5.下面的查询也将导致全表扫描: select id from t where name like ‘%abc%’ 若要提高效率,可以考虑全文检索。
6.in 和 not in 也要慎用,否则会导致全表扫描。
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引 而进行全表扫描。
8.应尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而 进行全表扫描。
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系 统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中 的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可 能的让字段顺序与索引顺序相一致。
3.16 数据库优化方案整理
1、优化分片键(如果有分库分表)
(1)不要使用分区,分区性能很低,难以维护
(2)不要使用主从数据库,读写分离有了缓存就再也不需要分主从了,毕竟延迟问 题是无法解决的(虽然很小)
(3)如果使用分库分表,那么查询条件务必先走分片键,否则就成了全表查询,性 能超低 2、优化索引
(1)索引列务必重复度低
(2)使用索引就不能用 OR 查询,否则索引不起作用
(3)使用索引,like 模糊查询不能以%开头
(4)查询条件务必以索引列开头,否则索引失效
(5)联合索引遵守最左原则
3、优化缓存 分离冷热数据,对于大内存访问评率低的数据适当分离 提高缓存命中率,命名问题
4、优化 sql
- 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等
- 建立单列索引
- 根据需要建立多列联合索引
- 当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低
- 如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
4.1. Spring 是什么?
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础 性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需 求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
4.2.Spring 的优点?
(1)spring 属于低侵入式设计,代码的污染极低;
(2)spring 的 DI 机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(3)Spring 提供了 AOP 技术,支持将一些通用任务,如安全、事务、日志、权 限等进行集中式管理,从而提供更好的复用。
(4)spring 对于主流的应用框架提供了集成支持。
4.3、Spring 的 AOP 理解?
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命 名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
AOP 实现的关键在于 代理模式,AOP 代理主要分为静态代理和动态代理。静态代 理的代表为 AspectJ;动态代理则以 Spring AOP 为代表。
(1)AspectJ 是静态代理的增强,所谓静态代理,就是 AOP 框架会在编译阶段生 成 AOP 代理类,因此也称为编译时增强,他会在编译阶段将 AspectJ(切面)织入到 Java 字 节码中,运行的时候就是增强之后的 AOP 对象。
(2)Spring AOP 使用的动态代理,所谓的动态代理就是说 AOP 框架不会去修改 字节码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP 对象包含了 目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
4.4、Spring 的 IoC 理解?
(1)IOC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权 和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去 创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
(2)最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 spring 自动 生产,使用 java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并 调用对象的方法的
4.5、Spring 的 IOC 有三种注入方式 Spring 的 IOC 有三种注入方式 :
构造器注入、setter 方法注入、根据注解注入。