注:
以下点都是本人在工作过程中遇到且实现的,由于资历浅薄,可能只是数据库优化的一小部分,见谅.后续遇到会持续补充
——————————————————分割线————————————————————
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等其他任何数据库.