1数据库锁
悲观锁:从数据开始更改时就将数据锁住,知道更改完成才释放,悲观锁一般就是我们通常说的数据库锁机制
乐观锁:直到修改完成准备提交所做的的修改到数据库的时候才会将数据锁住完成更改后释放。
2分区分表
1,什么是 mysql 分表和分区
分表:从表面意思上看呢,就是把一张表分成 N 多个小表 。
分区:分区就是把一张表的数据分成 N 多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。
2、mysql 分表和分区有什么区别呢
1实现方式上
2数据处理上
3提高性能上
3.mysql 分表的三种方法
1做 mysql 集群,虽然它不是实际意义上的分表,但是它起到了分表的作用。
2预先估计会出现大数据量并且访问频繁的表,将其分为若干个表
3利用 merge 存储引擎来实现分表
4. 分区类型
range 分区:基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区
list 分区:类似于 range 分区,区别在于 list 分区是居于枚举出的值列表分区,range是基于给定的连续区间范围分区
hash 分区:基于给定的分区个数,把数据分配到不同的分区
key 分区:类似于 hash 分区
3 应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑。
1,如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。
2,如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分
在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂 直切分,又要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们 首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行 水平切分。
4mysql 读写分离
在实际的应用中,绝大部分情况都是读远大于写,Mysql 提供了读写分离 的机制,所有的写操作都必须对应到 Master,读操作可以在 Master 和 Slave 机 器上进行,Slave 与 Master 的结构完全一样,一个 Master 可以有多个 Slave,甚 至 Slave 下还可以挂 Slave,通过此方式可以有效的提高 DB 集群的每秒查询率. 26 所有的写操作都是先在 Master 上操作,然后同步更新到 Slave 上,所以 从 Master 同步到 Slave 机器有一定的延迟,当系统很繁忙的时候,延迟问题会 更加严重,Slave 机器数量的增加也会使这个问题更加严重。
5MySQL 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.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:select col1,col2 into #t from t where 1=0这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样create table #t(...) 。
13.很多时候用exists代替in是一个好的选择:select num from a where num in(select num from b)
用下面的语句替换:select num from a where exists(select 1 from b where num=a.num) 。
14.并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
6 数据库优化方案整理
1、优化分片键(如果有分库分表)
(1)不要使用分区,分区性能很低,难以维护
(2)不要使用主从数据库,读写分离有了缓存就再也不需要分主从了,毕竟延迟问题是无法解决的
(3)如果使用分库分表,那么查询条件务必先走分片键,否则就成了全表查询,性能超低
2、优化索引
(1)索引列务必重复度低
(2)使用索引就不能用 OR 查询,否则索引不起作用
(3)使用索引,like 模糊查询不能以%开头
(4)查询条件务必以索引列开头,否则索引失效
(5)联合索引遵守最左原则
3、优化缓存
分离冷热数据,对于大内存访问评率低的数据适当分离提高缓存命中率,命名问题
4、优化 sql
1. 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等
2. 建立单列索引
3. 根据需要建立多列联合索引
4. 当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低
5. 如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。
(1) 根据业务场景建立覆盖索引只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率
(2) 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率
(3) where 条件字段上需要建立索引
(4) 排序字段上需要建立索引
(5) 分组字段上需要建立索引
(6) Where 条件上不要使用运算函数,以免索引失效
6 Spring 是什么?
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础
性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需
常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
主要由以下几个模块组成:
Spring Core:核心类库,提供 IOC 服务;
Spring Context:提供框架式的 Bean 访问方式,以及企业级功能
Spring AOP:AOP 服务;
Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的 ORM 框架的支持;
Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。
7.Spring 的优点?
(1)spring 属于低侵入式设计,代码的污染极低;
(2)spring 的 DI 机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(3)Spring 提供了 AOP 技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用
(4)spring 对于主流的应用框架提供了集成支持。
8Spring 的 AOP 理解?
AOP面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为切面,减少重复代码,模块间解耦,提高了系统的可维护性。用于权限认证、日志、事务处理。
AOP主要是通过动态代理实现。
AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:
1,JDK 动态代理只提供接口的代理,不支持类的代理,动态实现代理接口,然后通过反射动态调用代理方法
2,CGlib动态代理通过继承的方式,动态创建一个目标子类继承业务类,通过方法拦截器,实现对目标方法的一个增强。因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。
9Spring 的 IoC 理解?
1,IOC 就是控制反转,创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
2,IOC 让对象的创建不用去 new 了,可以由 spring 自动生产,使用 java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
10Spring 的 IOC 有三种注入方式
Spring 的 IOC 有三种注入方式 :构造器注入、setter 方法注入、根据注解注入