书写高质量SQL

*1.查询SQL尽量不要使用select ,而是select具体字段。
2.如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1
3.应尽量避免在where子句中使用or来连接条件
分开两条sql写:
select * from user where userid=1
select * from user where age = 18

//使用union all
select * from user where userid=1
unionall
select * from user where age = 18
4.优化limit分页
//方案一 :返回上次查询的最大记录(偏移量)
select id,name from employee where id>10000 limit 10.

//方案二:orderby + 索引
select id,name from employee order by id limit 10000,10
5、优化你的like语句
select userId,name from user where userId like'123%';
6、使用where条件限定要查询的数据,避免返回多余的行
Long userId = sqlMap.queryObject("select userId from user where userId='userId' and isVip='1'")
boolean isVip = userId!=null;
7.尽量避免在索引列上使用mysql的内置函数
explain select userId,loginTime from loginuser where  loginTime >= Date_ADD(NOW(),INTERVAL - 7DAY);
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫
select * from user where age =11;
9.Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小
  • Inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
  • left join 在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
  • right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
select * from (select * from tab1 where id >2) t1 left join tab2 t2 on t1.size = t2.size;
10、如果插入数据过多,考虑批量插入。
//一次500批量插入,分批进行
insert into user(name,age) values
<foreach collection="list" item="item" index="index" separator=",">
    (#{item.name},#{item.age})
</foreach>
11、不要有超过5个以上的表连接
  • 连表越多,编译的时间和开销也就越大。
  • 把连接表拆开成较小的几个执行,可读性更高。
  • 如果一定需要连接很多表才能得到数据,那么意味着糟糕的设计了。
12、尽可能使用varchar/nvarchar 代替 char/nchar。
`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'
13、如何字段类型是字符串,where时一定用引号括起来,否则索引失效
select * from user where userid ='123';
14.使用explain 分析你SQL的计划
explain select * from user where userid =10086 or age =18;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容