MySQL使用行号分页

  1. 背景

有个给第三方系统提供的接口说是效率低下,很慢,无法满足系统要求,故排查。生产数据库多个表关联,左表没有主键没有索引,大概十几万数据量,没有唯一字段,所以无法新增主键。增加组合索引时锁表了,查看进程,再kill掉,然后放弃不再通过索引进行优化。

  1. 方案

方案1:增加组合索引。迁移数据。

先将数据导出到备份表,然后建立组合索引,再进行导入数据。

方案2:创建子查询,将左表先分页,再和其他关联表进行left join

  1. 验证

方案1: 由于左表数据量太大,建立组合索引后,在关联查询时还是导致全表扫描,无法高效聚合。

方案2:在左表中使用limit和offset进行逻辑分页后,再与其他表关联。发现limit和offset竟然失效。

  1. 最终:

使用行号分页,然后将传递过来的分页参数进行拼装。解决问题。

select a.* from (SELECT @rowno:=@rowno+1 as rowno,r.* from supply_product r,(select @rowno:=0) t ) a where a.rowno between #{pageSize}*(#{pageNum}-1)+1 and #{pageNum}*#{pageSize}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值