SQL优化

mysql中百万级数据查询sql优化

https://www.likecs.com/show-306178654.html
本次的优化在于mysql的 SQL_CALC_FOUND_ROWS函数,这个是什么可以自行查阅下相关资料,
优化一个百万级数据量查询的SQL可以从以下方面入手:

  1. 创建索引:对于经常查询的字段创建索引可以大大提高查询效率。但是索引也会占用磁盘空间和写入时间,所以需要权衡索引的创建。

  2. 分页查询:对于百万级以上的数据量,一次查询出来的数据过多会耗尽内存,可以利用LIMIT子句进行分页查询,一般采用偏移量和限制条数的方式,比如LIMIT 0, 10表示从第一条数据开始取10条。

  3. 减少JOIN操作:JOIN操作会使SQL语句变得复杂,查询效率低下。尽可能减少JOIN操作可以提高查询速度。

  4. 合理利用缓存:对于查询频率较高且不怎么变化的数据,可以考虑将其缓存起来,避免重复查询。

  5. 优化查询语句结构:使用查询语句时,遵循语句的最佳实践, 使用条件过滤掉无关数据、使用合适的统计函数汇总数据等。

应用场景

一、场景举例
1、查询文章列表,一直滑动翻页,不用跳转到指定页数

2、从数据库查询百万客户数据写入到redis。

通过分页定时,将数据存入redis

3、访问某小程序的积分商城查看商品,一直滑动翻页,不用跳转到指定页数。

原SQL 当数据量大于百万级时——解决方案:

select id , name from user limit #{(pageNum-1)*pageSize}, #{pageSize};

子查询

select id , name from user where id>=( select id from user order by id limit #{(pageNum-1)*pageSize},1 ) limit #{pageSize};

内连接(inner jon)查询

我们可以把子查询(利用聚集索引)的结果当成一张临时表,然后和原表进行关联查询,类似以下的SQL:

SELECT
c.id,c.'name",c.no
FROM
t_customer c
WHERE delete_flag = 0 DRDER BY id LIMIT #offset),#pageSize)) as d(SELECT id FROM t_customer
where
c.id = d.id;

使用游标分页查询(缺点是不能跳页查询了)

当我们查询第二页的时候,把第一页的查询结果(返回最后一条记录的Id)放到第二页的查询条件中,类似以下的SQL:

SELECT
c.id,c.no,c.name
FROM
t_customer c
WHERE
c.delete_flag = 日 and id > #{lastId]order by c.id limit #ipageSize};
posted @ 2023-03-13 16:34  没有烦恼的猫猫  阅读(22)  评论(0编辑  收藏  举报