数据库优化相关的知识,及高并发下的数据库优化,解决数据库并发瓶颈

注:

以下点都是本人在工作过程中遇到且实现的,由于资历浅薄,可能只是数据库优化的一小部分,见谅.后续遇到会持续补充


——————————————————分割线————————————————————


1.不要写select *

永远不要写 select *,要直接写字段。

因为 * 还需要被解析一次成为相应的字段,耗费效率,时间.若是代码中有 select *,那么这也是优化数据库访问效率的一个点


——————————————————分割线———————————————————


2.注册用户判断是否已经被注册过了

这是我项目实际过程中运用的一个经验。

之前逻辑是: 

  • 查询一次数据库是否有该用户 
  • 没有再执行插入

在高并发下,每一条sql都会极大的影响最终的TPS(每秒处理的事务).则想方法去掉没用的sql

方法为:

不查询直接插入

  • 结果1:成功插入,则返回成功
  • 结果2:插入失败,抛出异常    

结果2有两种情况:

  • A:主键重复(用户名重复)  
  • B:其他异常

A,B以e.getMessage().contain("Duplicate keys")这种方式来区分即可,这样也实现了前面的逻辑,且在正常情况下少了一次查询数据库.

题外话:

一般这种注册逻辑是前端在输入用户名的时候就执行异步ajax请求,查看用户名是否重复。并显示给用户,之后提交表单直接判断这个ajax返回的值是否代表重复即可。

但是,后端和前端是分开的,后端永远不应该信任前端所做的判断,一个健壮的后端服务器应该能处理所有的情况。因此就算前端判断了但是服务器后端也应该判断。

----------**1.不要写select***永远不要写 select *,要直接写字段。因为 * 还需要被解析一次成为相应的字段,耗费效率,时间.若是代码中有 select * ,那么这也是优化数据库访问效率的一个点----------**2.注册用户判断是否已经被注册过了***这是我项目实际过程中运用的一个经验之前逻辑是: - 查询一次数据库是否有该用户 -没有再执行插入在高并发下,每一条sql都会极大的影响最终的TPS(每秒处理的事务).则想方法去掉没用的sql方法为: - **不查询直接插入** ```结果1:成功插入,则返回成功结果2:插入失败,抛出异常 A:主键重复(用户名重复) B:其他异常A,B以e.getMessage().contain("Duplicate keys")这种方式来区分即可,这样也实现了前面的逻辑,且在正常情况下少了一次查询数据库.```题外话:一般这种注册逻辑是前端在输入用户名的时候就执行异步ajax请求,查看用户名是否重复。并显示给用户,之后提交表单直接判断这个ajax返回的值是否代表重复即可。**但是,后端和前端是分开的,后端永远不应该信任前端所做的判断,一个健壮的后端服务器应该能处理所有的情况。因此就算前端判断了但是服务器后端也应该判断。**
@Override
	public String save(User user) {
		try {
			// xxxxx code
			int update = baseDbutilsDao.update(sql,user);
			return update + "";
		} catch (Exception e) {
			// TODO Auto-generated catch block
			logger.warn(e.getMessage());
			String s = e.getMessage();
			if (s.indexOf("Duplicate entry") != -1) {
				return "-2";
			}
			return null;
		}

	}

——————————————————分割线————————————————————

3.不必要的sql语句尽量去除

2是其中一条实例,该原则也可以用于redis等其他任何数据库.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值