数据库常用优化方案

本篇博客来源于各个网站,经过作者精心筛选后,整理出来的一些常用的sql优化案例。

1、SQL判断是否“存在”,还在用count操作?

业务代码中,需要根据一个或多个条件,查询是否存在记录,不关心有多少条记录。

普遍写法:

/*SQL写法*/

SELECT COUNT(*) FROM table WHERE a=1 AND b=2;
//或者
SELECT COUNT(0) FROM table WHERE a=1 AND b=2;


/*Java写法*/

int nums = xxDao.countXxxxByXxx(params);
if (nums > 0) {
    //当存在时,执行这里的代码
} else {
    //当不存在时,执行这里的代码
}

优化方案:

/*SQL写法*/

SELECT 1 FROM table WHERE a=1 AND b=2 LIMIT 1; //Mysql

SELECT 1 FROM table WHERE a=1 AND b=2 AND ROWNUM=1; //Oracle

/*Java写法*/
Integer exist = xxDao.existXxxxByXxx(params);
if (exist != NULL) {
    //当存在时,执行这里的代码
} else {
    //当不存在时,执行这里的代码
}

拓展知识:

关于Oracle中的ROWNUM限制查询条数。对于ROWNUM来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且ROWNUM不能以任何表的名称作为前缀。ROWNUM对于大于某值的查询条件不成立,查不到任何记录。  如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。详细查看博客:oracle限制查询条数-rownum用法详解

2、前端通过缓存的方式减少与后台和数据库的交互

在实际开发过程中,经常见过结构树的数据,检验输入的数值是否为结构树的末端。一种方式:直接使用sql查找所有的非末端或者末端数据,前端通过遍历缓存到一个数组或对象中。缺点:当用户新增结构树时并没有清理浏览器缓存,新增数据没法检验。第二种方式:通过输入数据为sql筛选条件,查找这一条数据是否为末端数据,如果是,前端将该数据缓存到对象{val:0}或者数组中,再输入一条新数据,先通过缓存对象和数组检验,校验通过在通过sql查询这条新数据是否为末端数据,如果是末端数据,就加入缓存对象或数组中。

举个例子(第二种方式):

function handle(){
    var obj = {}; //缓存对象,用于存储非末端数据{key:"0"}
    
    return function(){
        var input = $.trim($("input[name=goodname]").val()); //输入的结构树值
        var isClearEmpty = false; // 是否要清空input值
        if(input !== ""){    
           $.each(obj,function(k,v){
                if(k == input){
                    isClearEmpty = true;
                    return false;
                }
           }); 
           if(!isClearEmpty) {
                 ...... //与后台交互 ,查找是否为末端数据,返回一个对象rObj
                 if(!$.isEmptyObject(rObj)){
                      obj[input] = "0";
                      isClearEmpty = true; 
                 }
           }
           if(isClearEmpty) {
                $("input[name=goodname]").val("");
                alert("输入数据不是末端数据");
           }
        }
       
    }
}
$("input[name=goodname]").on("click",handle(),false);   
    

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值