mysql超大分页处理方法及分析

mysql超大分页处理方法及分析

数据库表

首先创建了test表,主键为id字段,为score字段建立了索引,并为test表生成了100w条数据
数据库表

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `score` int NOT NULL,
  `info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `s2`(`score` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

问题分析

当数据库数据量很大的时候,我们直接使用limit分页时,性能会很差。比如下面这条语句:

SELECT * FROM test ORDER BY score LIMIT 900000,10;
-- 平均1.1s

首先,mysql在使用limit时,会加载全部900010条数据并丢弃前900000条,并且,在score字段上建立的索引为二级索引,在获取全部数据的过程中一直会进行回表查询,因此我们需要对其进行优化:

SELECT * FROM test t1,(SELECT id FROM test ORDER BY score LIMIT 900000,10) t2 WHERE t1.id=t2.id;
-- 平均0.18s

在优化后的sql语句中,首先获取所需数据的id,再根据id查询整行数据,在这两段过程中全部为覆盖索引,不会发生回表查询,速度较快

启发思考

如果排序的字段为主键,同样的操作是否能够提升性能

SELECT * FROM test order by id LIMIT 900000,10;
-- 平均0.28s
SELECT * FROM test t1,(SELECT id FROM test order by id LIMIT 900000,10) t2 WHERE t1.id=t2.id;
-- 平均0.18s

可以看到,同样提升了部分性能,我认为,虽然两种方式都不会发生回表查询,但是select*在查询前900000条数据时也会返回整行的数据,第二种种方式在查询前900000条数据时只会返回id,因此相较于第一种方式依然提升了性能

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中进行大批量快速分页查询,可以使用以下方法来优化查询性能: 1. 使用索引:确保查询的字段上建立了适当的索引。索引可以加快查询的速度,并减少数据库的扫描操作。 2. 使用LIMIT语句进行分页:使用LIMIT语句限制返回的结果行数,并使用OFFSET参数指定起始位置。例如,LIMIT 10 OFFSET 20 表示返回第21到第30行的结果。 3. 避免使用SELECT *:只选择需要的列,避免不必要的数据传输和处理,提高查询效率。 4. 使用子查询或联接优化:如果需要在分页查询中使用复杂的条件或关联查询,可以考虑使用子查询或联接来优化查询性能。 5. 使用缓存:如果分页查询结果相对稳定,可以考虑使用缓存技术(如Redis)缓存查询结果,减少数据库的访问次数。 6. 分批加载数据:如果可能,可以将大批量数据分成多个小批次加载,避免一次性加载过多数据导致性能下降。 7. 使用延迟加载:对于大批量数据中的某些字段,可以使用延迟加载技术,在需要时再加载这些字段的数据,减少数据传输量和处理时间。 8. 优化查询语句:通过分析和调整查询语句,使用合适的查询优化技巧,如避免使用全表扫描、合理使用索引等,提高查询性能。 以上是一些常用的方法,可以根据具体情况选择适合的优化策略来加快MySQL的大批量快速分页查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值