当前位置: 首页 > 科技观察

SQL判断是否“存在”,不要再用count了

时间:2023-03-12 02:25:44 科技观察

按一定条件从数据库表中查询“是”和“否”,只有两种状态,为什么还要SELECT什么时候写SQL?COUNT(*)呢?图片来自Pexels无论是刚入道的新程序员,还是征战沙场多年的程序员,永远都是COUNT。目前大多数人在多次编写REVIEW代码的时候,发现有一个现象:在业务代码中,不管有多少条记录,都需要根据一个或多个条件来检查是否有记录。常见的SQL和代码写法如下:#####SQL写法:SELECTcount(*)FROMtableWHEREa=1ANDb=2#####Java写法:intnums=xxDao.countXxxxByXxx(params);if(nums>0){//存在时,执行这里的代码}else{//不存在时,执行这里的代码}是否OK,没问题?推荐的优化方案写法如下:#####SQL写法:SELECT1FROMtableWHEREa=1ANDb=2LIMIT1#####Java写法:Integerexist=xxDao.existXxxxByXxx(params);if(exist!=NULL){//存在时,执行这里的代码}else{//不存在时,执行这里的代码}SQL不再使用COUNT,而是使用LIMIT1,这样数据库在查询的时候遇到一个就返回,并且不要继续搜索还有多少。直接在业务代码中判断是否非空即可!根据查询条件检测到的条目越多,性能提升越明显。在某些情况下,还可以减少联合索引的创建。总结COUNT()做了两件截然不同的事情:它计算一列中值的数量,它计算行数。统计列值时,要求列值非空(不统计NULL)。如果在COUNT()的括号中指定了列或列表达式,则计数是具有该表达式值的结果数。......COUNT()的另一个功能是统计结果集中的行数。MySQL在确认括号内表达式的值不能为null时,实际上是在统计行数。最简单的就是我们使用COUNT(*)的时候,这种情况下通配符*并没有像我们猜测的那样扩展到所有的列,实际上他忽略了所有的列,直接统计了所有的行。——《高性能MySQL》反正我们判断它存在与否。你只需要判断有没有,而不是有没有!某些情况下,不继续统计行数,直接返回!巧妙地使用LIMIT1可以获得更高的效率,尤其是在一些复杂且不规范的句子中效果更加明显!作者:程序员炯图编辑:陶家龙来源:toutiao.com/i6826511837840802315