本篇博客来源于各个网站,经过作者精心筛选后,整理出来的一些常用的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);