30条书写高质量SQL的建议,太有用了!

作者:微信小助手

发布时间:2020-03-24T20:12:40

本文将结合实例 demo,阐述 30 条有关于优化 SQL 的建议,多数是实际开发中总结出来的,希望对大家有帮助。


图片来自 Pexels

1


查询 SQL 尽量不要使用 select *,而是 select 具体字段


反例子:

select * from employee;

正例子:

select idname from employee;


理由如下:
  • 只取需要的字段,节省资源、减少网络开销。

  • select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。


2


如果知道查询结果只有一条或者只要最大/最小一条记录,建议用 limit 1


假设现在有 employee 员工表,要找出一个名字叫 jay 的人:

CREATE TABLE `employee` (
  `id` int(11NOT NULL,
  `name` varchar(255DEFAULT NULL,
  `age` int(11DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `sex` int(1DEFAULT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

反例:

select idname from employee where name='jay'


正例:

select idname from employee where name='jay' limit 1;


理由如下:
  • 加上 limit 1 后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大提高。

  • 当然,如果 name 是唯一索引的话,是不必要加上 limit 1 了,因为 limit 的存在主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表扫描,有没有 limit ,性能的差别并不大。


3


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


新建一个 user 表,它有一个普通索引 userId,表结构如下:

CREATE TABLE `user` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `userId` int(11NOT NULL,
  `age` int(11NOT NULL,
  `name` varchar(255NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;


假设现在需要查询 userid 为 1 或者年龄为 18 岁的用户,很容易有以下 SQL。

反例:

select * from user where userid=1 or age =18


正例:

//使用union all 
select * from user where userid=1 
union all 
select * from user where age = 18

//或者分开两条sql写:
select * from user where userid=1
select * from