1、优化SQL语句
1、避免使用*号查询,需要什么字段查取什么字段;
2、避免在where子句中使用!=或<>操作,否则会导致索引失效从而进行全表查询;
3、避免对字段进行null值判断,否则会导致索引失效从而进行全表查询;
4、左模糊查询也会导致全表扫描;
5、避免使用or来连接条件,如果一个字段有索引,一个字段没有索引,也会导致索引失效从而进行全表查询;
2、选取最适和的字段属性
比如邮编只有六位,我们不可能去使用char(255),甚至使用varchar也是不合理的,因为char(6)就已经可以完成任务了,所以不需要浪费更多的空间。
3、使用连接代替子查询
比如我们要将所有没有订单的用户查询出来,使用子查询的话我们需要两个步骤,但是使用连接的话我们只需要一步,所以MySQL不要再内存中创建临时表来完成这个逻辑上需要两个步骤的业务
4、使用联合来代替手动创建临时表
有的时候需要将多个查询结果合并到一个查询中,我们使用联合和方便的将查询结果合并在一起,使用时只需要使用union关键字将查询语句连接起来就行了,但是查询的字段要相同
5、事务
在我们的项目中,一个业务往往需要多条SQL语句来完成,在这种情况下,某条SQL语句出现了错误,整个语句块就会出现问题,但是前边执行的SQL语句已经将数据进行了更改,要避免这种情况的发生,我们应该使用事务。
事务的作用是:要么语句块中的所有SQL语句执行成功,要么全部执行失败,此时就可以保证数据库中数据的一致性和完整性。
事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
6、使用外键
使用外键可以减少数据冗余,比如,一张表中有一个字段是关于用户的学籍,那么我们在表中需要每条数据都要描述,那么重复的数据会很多,而且占存会越来越多,。。。。。。
7、使用索引
索引简单来说就是数据库表中某一列的所有值,索引是基于数据库表中的某一列创建的。使用索引可以提升数据的检索速度,例如:一本书的目录
**支持当前事务,如果当前没有事务,就新建一个事务。**也就是说业务方法需要在一个事务中运行,如果业务方法被调用时,调用业务方法的行为(方法)已经处在一个事务中,那么就加入到该事务,否则为自己创建一个新的事务(默认传播属性)。
**支持当前事务,如果当前没有事务,就以非事务方式执行。**也就是说如果业务方法在某个事务范围内被调用,则该方法成为该事务的一部分。如果业务方法在事务范围外被调用,则该方法在没有事务的环境下执行。
**支持当前事务,如果当前没有事务,就抛出异常。**也就是说业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下被调用,容器就会抛出例外。
**新建事务,如果当前存在事务,把当前事务挂起。**也就是说业务方法被调用时,不管是否已经存在事务,业务方法总会为自己发起一个新的事务。如果调用业务方法的行为(方法)已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到业务方法执行结束,新事务才算结束,原先的事务才会恢复执行。
**以非事务方式执行,如果当前存在事务,就把当前事务挂起。**也就是说业务方法不需要事务。如果方法没有被关联到一个事务中,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
**以非事务方式执行,如果当前存在事务,则抛出异常。**也就是说业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。
如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按REQUIRED属性执行。它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。每种数据库的默认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。另外四个与JDBC的隔离级别相对应,不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。
读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许一个事务可以读到另一个事务未提交的更新数据。(会出现脏读,不可重复读和幻读)
读已提交数据,保证在并发的事务中,一个事务修改的数据提交后才能被另外一个事务读取到。(会出现不可重复读和幻读)
可重复读,这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。一般是采用“快照”的方式来实现的。
**事务被处理为顺序执行。这是花费最高,但也是最可靠的事务隔离级别。**能有效的避免脏读、不可重复读、幻读。
Spring Boot一个基于Spring框架的扩展,它消除了Spring应用程序所需要的繁杂配置,更快,更高效。
1、快速入门,学习成本低:
2、简化编码:创建一个web项目,使用Spring的时候,需要在pom文件中添加多个依赖,而Spring Boot则只需要在pom文件中添加一个starter-web依赖即可;
3、简化部署:因为Spring Boot内嵌了Tomcat,只需要将项目打成jar包,使用java -jar xxx.jar 意见是启动项目;
4、没有冗余代码的生成及xml配置
5、版本管理
6、热部署
7、约定大于配置
8、自动装配
@SpringBootApplication:说明这个类是一个启动类,Spring Boot运行这个类的main方法来的启动Spring Boot项目。
点击去这个注解,我们这个注解一一个组合注解,里边有很多注解,其中有个@SpringBootConfiguration注解和@EnableAutoConfiguration注解,
第一个注解会发现有一个@Configuration注解,表明这个类是一个Spring的配置类,再点进去看会发现@Component注解,表明Spring的配置类也是Spring的一个组件。
第二个注解是开启自动配置的功能,点进去会看到一个@AutoConfigurationPackage注解和@Import({AutoConfigurationImportSelector.class})注解。
第一个注解是用来自动配置包,点进去看,有一个@Import(XX.class)注解,自动配置包主要是使用的此注解中类字节码来给Spring容器中导入一个组件的(扫描包路径);
第二个注解,传入组件的选择器,这个类里边selectImports方法,将所有需要导入的组件以完全限定名的方式返回,这些组件就会被添加到容器中;有了自动配置类,他是通过this.getCandiadateConfigurations()这个方法中loadFactoryNames()这个方法来从META-INF/spring.factories中获取资源,然后通过properties加载资源。
所以Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器中,自动配置类就生效,帮我们进行自动配置工作。所以完成自动装配。
9、yml配置文件与properties的区别:
写法上:yml采用键值对(类似于json格式),冒号后跟空格,通过冒号进行赋值;而properties以.为分割,采用完全限定名=值的方式来赋值的;
规范上:yml用缩进来表示层次,严谨度高;而properties层级太深;