书写高质量SQL的建议

数据库 SQL Server
今天列举了一些关于优化 SQL 的建议,多数是实际开发中总结出来的,希望对大家有帮助。

 [[416064]]

1、避免混乱的逻辑

反例:(统计用户数量)

 

  1. List<User> users = userMapper.selectAll(); 
  2. return users.size(); 

 

正例:

 

  1. int count = userMapper.countUser("select count(*) from user"); 
  2. return count

 

2、select one 如果已知结果只有一条, 使用limit 1

反例:(查找nickname = 报之琼瑶 的用户)

 

  1. select  id, nickname from t  where nickname = '报之琼瑶' 

正例:

 

  1. select  id, nickname from t  where nickname = '报之琼瑶' limit 1 

理由:

  1. 加上limit1,只要找到了对应的一条记录, 就不会继续向下扫描了,效率会大大提高。limit1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。
  2. 如果条件列上有索引就不用limit 1,如主键查询 id = 1

3、尽量避免在where子句中使用or来连接条件

反例:(查找name = 张三 或者 法外狂徒 的用户)

 

  1. select id,name from t where name = '张三' or name = '法外狂徒' 

正例:

 

  1. select id,name from t where name = '张三' 
  2. union all 
  3. select id,name from t where name = '法外狂徒' 

 

理由:

使用or将导致引擎放弃使用索引而进行全表扫描

4、优化like关键字

like常用于模糊查询, 不恰当的编码会导致索引失效

反例:

 

  1. select userId,name from user where userId like '%123' 

正例:

 

  1. select userId,name from user where userId like '123%' 

 

书写高质量SQL的建议

 

 

%123, 百分号在前不走索引

 

书写高质量SQL的建议

 

123%,百分号在后走索引

但是也会存在百分号在后不走索引的情况,mysql的innodb存储引擎最终执行哪种方法都是基于成本计算的, 通过比较全表扫描和二级索引比较再回表查询

可以通过

INFORMATION_SCHEMA.OPTIMIZER_TRACE来分析查询过程

 

书写高质量SQL的建议

 

trace字段json复制出来即可分析

5、查询SQL尽量不要使用select *,而是select具体字段, 不要返回用不到的任何字段。

反例:(统计用户数量)

 

  1. select  *  from  t   

正例:

 

  1. select id, name, tel from t 

理由:

  1. 妨碍优化器选择更优的执行计划,比如说索引扫描
  2. 增删字段可能导致代码崩溃

6、尽量避免在索引列上使用mysql的内置函数

反例:

 

  1. select * from user where date_add(create_time,Interval 5 day) >=now() 

正例:

 

  1. select * from user where create_time >= date_add(now(), interval - 5 day

 

书写高质量SQL的建议

 

不走索引

 

书写高质量SQL的建议

 

走索引

7、应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫

反例: (对字段user_age进行运算操作, 不走索引)

 

  1. select * from user where user_age - 1 = 2 

正例: (走索引)

 

  1. select * from user where user_age = 3 

 

责任编辑:华轩 来源: 今日头条
相关推荐

2020-03-25 09:01:34

SQL建议索引

2020-04-10 16:30:16

SQL数据库索引

2022-10-24 08:10:21

SQL代码业务

2017-07-14 09:54:47

代码函数程序

2011-05-31 13:43:46

外链

2023-07-06 14:51:30

开发高质量软件

2012-09-13 10:44:18

Python代码

2011-03-04 10:11:09

JavascriptAPI

2015-08-25 08:42:36

高质量代码命名

2019-05-06 15:20:31

华为

2020-09-18 07:57:10

代码编码开发

2015-08-25 08:29:11

编写高质量命名

2011-12-29 15:02:27

JavaScript

2024-03-07 11:39:24

HadolintDockerfile工具

2015-08-03 10:40:59

程序员代码质量Quora

2011-06-24 14:59:41

外链

2011-07-20 15:26:52

C++

2015-08-19 08:54:23

Android开发框架

2023-10-15 12:07:09

点赞
收藏

51CTO技术栈公众号