背景
有个给第三方系统提供的接口说是效率低下,很慢,无法满足系统要求,故排查。生产数据库多个表关联,左表没有主键没有索引,大概十几万数据量,没有唯一字段,所以无法新增主键。增加组合索引时锁表了,查看进程,再kill掉,然后放弃不再通过索引进行优化。
方案
方案1:增加组合索引。迁移数据。
先将数据导出到备份表,然后建立组合索引,再进行导入数据。
方案2:创建子查询,将左表先分页,再和其他关联表进行left join
验证
方案1: 由于左表数据量太大,建立组合索引后,在关联查询时还是导致全表扫描,无法高效聚合。
方案2:在左表中使用limit和offset进行逻辑分页后,再与其他表关联。发现limit和offset竟然失效。
最终:
使用行号分页,然后将传递过来的分页参数进行拼装。解决问题。
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}