1.sql优化:
2.分片批量插入数据
这样只需要远程请求一次数据库,sql 性能会得到提升,数据量越多,提升越大。
但需要注意的是,不建议一次批量操作太多的数据,如果数据太多数据库响应也会很慢。批量操作需要把握一个度,建议每批数据尽量控制在 500 以内。如果数据多于 500,则分多批次处理。
3.增量查询
有时候,我们需要通过远程接口查询数据,然后同步到另外一个数据库
select * from user
where id>#{lastId} and create_time >= #{lastCreateTime}
limit 100;
按 id 和时间升序,每次只同步一批数据,这一批数据只有 100 条记录。每次同步完成之后,保存这 100 条数据中最大的 id 和时间,给同步下一批数据的时候用。
通过这种增量查询的方式,能够提升单次查询的效率。
4.高效的分页
select id,name,age
from user where id > 1000000 limit 20;
先找到上次分页最大的 id,然后利用 id 上的索引查询。不过该方案,要求 id 是连续的,并且有序的。
还能使用between优化分页。
select id,name,age
from user where id between 1000000 and 1000020;
需要注意的是 between 要在唯一索引(id)上分页,不然会出现每页大小不一致的问题。
5.用连接查询代替子查询
mysql 中如果需要从两张以上的表中查询出数据的话,一般有两种实现方式:子查询 和 连接查询。
子查询的例子如下:
select * from order
where user_id in (select id from user where status=1)
子查询语句可以通过in关键字实现,一个查询语句的条件落在另一个 select 语句的查询结果中。程序先运行嵌套在最内层的语句,再运行外层的语句。
子查询语句的优点是简单,结构化,如果涉及的表数量不多的话。
但缺点是 mysql 执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗
这时可以改成连接查询。具体例子如下:
select o.* from order o
inner join user u on o.user_id = u.id
where u.status=1
6 提升 group by 的效率
我们有很多业务场景需要使用group by关键字,它主要的功能是去重和分组。
通常它会跟having一起配合使用,表示分组后再根据一定的条件过滤数据。