mysql大数据量 分页查询优化

最近我老表问我一个面试问题,如果数据量很大,分页查询怎么优化。

个人觉得无非就是sql优化,

那无非就是走索引

避免回表查询(覆盖索引 ,也就是不要用select * ,走主键索引 ,叶子节点有保存了数据),

减少回表查询次数(定位到非聚簇索引树的叶子节点少,小表驱动大表等)

我下面自己测了一个500万数据,取偏移量400万20条数据的例子 ,话不多说上例子

表tb_user

bash 复制代码
CREATE TABLE `tb_user` (
  `user_id` bigint NOT NULL COMMENT '用户id',
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户'

500万数据

正常的sql

bash 复制代码
SELECT * FROM `tb_user` LIMIT 4000000, 20;    
EXPLAIN SELECT * FROM `tb_user` LIMIT 4000000, 20; //执行计划 看了全表扫描


优化后的sql,由于我的是long类型的主键雪花id所以我需要找到主键

像那些直接是递增的主键id 可以直接where user_id > 偏移量 ,但是是要表数据没被删过,不然你的id跟你的第几条数据对不上了

bash 复制代码
SELECT * FROM `tb_user` WHERE user_id > (SELECT user_id FROM `tb_user` LIMIT 3999999,1 ) LIMIT 20;
EXPLAIN SELECT * FROM `tb_user` WHERE user_id > (SELECT user_id FROM `tb_user` LIMIT 3999999,1 ) LIMIT 20;

可以看到快了0.3秒。

总之,就是sql优化的问题。

想看更多精彩内容,可以关注我的博客园
我的博客园

相关推荐
一只栖枝几秒前
OCP证书有效期是永久,但需要更新
数据库·开闭原则·ocp·oracle认证·ocp培训·ocp证书
王会举2 小时前
让SQL飞起来:搭建企业AI应用的SQL性能优化实战
数据库·人工智能·ai·性能优化
bing_1582 小时前
在 Spring Boot 项目中,如何进行高效的数据库 Schema 设计?
数据库·spring boot·后端·数据库schema设计
听雪楼主.2 小时前
Oracle补丁安装工具opatch更新报错处理
数据库·oracle
不吃元西2 小时前
对于客户端数据存储方案——SQLite的思考
数据库·sqlite
rgb0f02 小时前
MySQL视图相关
数据库·mysql·oracle
编程、小哥哥2 小时前
oracle值sql记录
数据库·sql·oracle
三千花灯3 小时前
jmeter提取返回值到文件
数据库·jmeter
萧离1953 小时前
超细的Linux安装minio教学
数据库
小吕学编程3 小时前
基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
数据库·后端·mysql·spring·kafka