【MySQL】常见的业务处理-分页显示

本文介绍了在MySQL中处理常见业务时如何进行分页显示,探讨了业务需求,并详细讲解了如何优化SQL查询以提升分页性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍


分页在我们日常开发中是非常常见的需求,我们通常会用LIMIT加上偏移量的办法实现。但是大家有没有考虑过当偏移量大的时候分页SQL的执行效率呢?下面以一个例子来模拟优化的过程。

业务需求


有一个商品评论表结构如下:


要求查询出某一个商品的前10条评论。

我们写出的SQL可能会是这个样子:


对SQL进行优化



使用EXPLAIN进行分析:


建立联合索引:

建立组合索引的时候,区分度最高的在左边。有一个例外就是存在非等号和等号混合判断条件时,在建立索引的时候,把等号条件的列前置。如where a>? and b=? 那么即使a的区分度更高,也必须把b放在索引的最前列。



目前数据库没有数据,如果有数据可以根据索引的区分度来选择优先级。同时要注意上面提到的非等号和等号混合判断条件的问题。


建立联合索引后对SQL进行一次分析,可以看到type由ALL变成ref:




问题的关键在于:MySQL并不是跳过offset(偏移量)行,而是取offset+N行,然后返回放弃钱offset行,返回N行,
假如offset特别大的时候效率就特别低下。
接下来对SQL语句的结构进行优化:




还可以这样写:


这样让MySQL扫描了更少的页面,获取要访问的记录后再根据关联列回表查询关联的列。将随机I/O变成了顺序I/O。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值