Sql优化_1

文章目录

  • ​​1.避免使用select *​​
  • ​​2.用union all代替union​​
  • ​​3.小表驱动大表​​
  • ​​4.批量操作​​
  • ​​5.多用lim数据分析it​​
  • ​​6.in内东西过多​数据库系统概论第五版课后答案
  • ​​7.增量查询​​
  • ​​8.高效的分页​​

1.避免使用select *

因为select * 查出来的数据是全部的数据,需要的数据包含其中,但是也有不需要的数据,效率低

selec数据透视表t*不走索引,会出现大量的回表操作,而从导帅气撩人高冷动漫男头致查询sql的性能很低。

select name,age from user where id=1;

sql语句查询时,只查需要用到的列,多余的列根本无需查出来。

2.用union all代替union

sql语句使用union关键字后,可以获取排重后的数据。

如果使用u数据库查询语句nion all关键字,可以获取所有数据,包含重复的数据。

(select * from user where id=1) 
union
(select * from user where id=2);

排重的过程需要遍历、排序和比较,它更耗时,更消耗cpu资源。

所以如果能用un数据库有哪几种ion a数据废土ll的时候,尽量不用union。

(select * from user where id=1) 
union all
(select * from user where id=2);

除非是有些特殊的场景,比如union all之后,结果集中出现了重复数据,而业务场景中是不允许产生重复mysql安装数据的,这时可以使用union。

3.小表驱动大表

小表驱动大表,也就是数据分析说用小表的数据集驱动大表的数据集。

假如有mysql面试order和user两张表,其中order表有10000条数据,而user表有mysql100条数据。
这时如果想查一下,所有有效的用户下过的订单列表。

i数据分析师n:

select * from order
where user_id in (select id from user where status=1)

exidatabase怎么读sts:

select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)

前面提到的这种业务场景,使用in关键字去实现业务需求,更加合适。

sql语句中包含了in关键字,则它会优先执行in里面的子查询语句mysql数据库命令大全数据废土然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更mysql数据库基础知识快。
sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,数据库系统概论第五版课后答案则可以查询出数据。如果匹配不数据库有哪几种上,数据就被过滤掉了。

所以 isql语句执行顺序n 为左边大表,右边小表, exsisql语句增删改查ts 为左sql语句大全实例教程边小表,右边mysql数据库基础知识大表

4.批量操作

反例

for(Order order: list){
orderMapper.insert(order):
}
insert into order(id,code,user_id) 
values(123,'001',100);

正例:

orderMapper.insertBatch(list):
insert into order(id,code,user_id) 
values(123,'001',100),(124,'002',100),(125,'003',101);

只会一次请求数据库,sql性能提高,数据量越大,提升越大

但需要注意的是,不建议一次批量操作太多的数据,如果数据太多数据库响应也会很慢。批量操作需要把帅气撩人高冷动漫男头握一个度,建议每批数据尽量控制在500以内。mysql如果数据多于500,则分多批次处理。sql数据库

5.多用limit

我们需要查询某些数据中的第一条,比如:查询某个用户下的第一个订单,想看看他第一次的首单时间。

反例:

select id, create_date 
from order
where user_id=123
order by create_date asc;

根据用户id查询订单,按下单时间排序,先查出该用户所有的订单数据,得到一个订单集合。然后在代码中,获取第一个元素的数据,即首单的数据,就能获取首单时间。

List list = orderMapper.getOrderList();
Order order = list.get(0);

这个需要查出全部的数据,然后取出第一条

优化:

select id, create_date 
from order
where user_id=123
order by create_date asc
limit 1;

此外,在删除或者修改数据时,为了防止误操作,导致删除或修改了不相干的数database数据库据,也可以在sql语句最后加上limit。

update order set status=0,edit_time=now(3) 
where id>=100 and id<200 limit 100;

这样即使误sql语句大全操作,比如把i苏卿陆容渊d搞错了,也不会对太多的数据造成影响。

6.in内东西过多

对于批量查询接口,我们通常会使用in关键字过滤出数据。比如:想通过指定的一些id,批量查询出用mysql安装户信息

select id,name from category
where id in (1,2,3...100000000);

这条语句会查出很多数据,很容易导致接口超时

select id,name from category
where id in (1,2,3...100)
limit 500;

可以在sql中对数据用limit做限制。

不过我们更多的是在业务上进行限制

public List getCategory(List ids) {
if(CollectionUtils.isEmpty(ids)) {
return null;
}
if(ids.size() > 500) {
throw new BusinessException("一次最多允许查询500条记录")
}
return mapper.getCategoryList(ids);
}

7.增量查询

有时候,我们需要通过远程接口查询数据,然后同步到另外一个数据库。

select * from user;

如果直接获取所有的数据,然后同步过去sql语句删除。这样虽说非常方便,但是带来了一个非常大的问题,就是如果数据很多的话,查询性能会非常差。

select * from user 
where id>#{lastId} and create_time >= #{lastCreateTime}
limit 100;

按id和时间升序,每次数据库管理系统只同步一批数据,这一批数据只有100条记录。每次同步完成之后,保帅气撩人高冷动漫男头存这100条舍曲林数据中最大的id和时间,给同步下一批数据的时候用。

通过这种增量查询的方式,能够提升单次查询的效率。

8.高效的分页

有时候,列表页在查询数据时,为了避免一次数据漫游返回过多的数数据漫游据影响接口性能,我们一般会对查询接口做分页处理。

select id,name,age 
from user limit 10,20;

如果表中数据量少,用limit关键字做分页,没啥问mysql怎么读题。但如果表中数据量很多,用它就会出现性能问题。

select id,name,age 
from user limit 1000000,20;

mysql会查到1000020条数据,然后丢弃前面的1000000条,只查后数据分析师面的20条数据,这个是非常浪费数据库有哪几种资源的。

优化sql数据库sql:

select id,name,age 
from user where id > 1000000 limit 20;

还能使用between优化分页。

select id,name,age 
from user where id between 1000000 and 1000020;