SQL优化
mysql中百万级数据查询sql优化
https://www.likecs.com/show-306178654.html
本次的优化在于mysql的 SQL_CALC_FOUND_ROWS函数,这个是什么可以自行查阅下相关资料,
优化一个百万级数据量查询的SQL可以从以下方面入手:
-
创建索引:对于经常查询的字段创建索引可以大大提高查询效率。但是索引也会占用磁盘空间和写入时间,所以需要权衡索引的创建。
-
分页查询:对于百万级以上的数据量,一次查询出来的数据过多会耗尽内存,可以利用LIMIT子句进行分页查询,一般采用偏移量和限制条数的方式,比如LIMIT 0, 10表示从第一条数据开始取10条。
-
减少JOIN操作:JOIN操作会使SQL语句变得复杂,查询效率低下。尽可能减少JOIN操作可以提高查询速度。
-
合理利用缓存:对于查询频率较高且不怎么变化的数据,可以考虑将其缓存起来,避免重复查询。
-
优化查询语句结构:使用查询语句时,遵循语句的最佳实践, 使用条件过滤掉无关数据、使用合适的统计函数汇总数据等。
应用场景
一、场景举例
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};
本文来自博客园,作者:没有烦恼的猫猫,转载请注明原文链接:https://www.cnblogs.com/maomao777/p/17211936.html