书写高质量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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值