mysql深度分页优化
1:最基本的,列表查询只返回需要展示的字段,尽量少关联,筛选条件尽量放主表,例如这个sql,ac.catalog_id, e.content字段不需要列表展示,而且e.content字段数据量大,导致网络传输变慢
2:如果表的主键是自增的话,可以在前端查询时传上一页的最后一条记录的ID,例如:
SELECT
a.id,
a.title,
a.cover_image,
a.publish_dt,
a.article_status,
a.create_time,
a.create_user_name,
a.create_user,
a.create_data_source,
a.intro,
a.view_count,
a.collect_count,
a.praise_count,
a.sort
FROM cms_article a
WHERE id > ?
ORDER BY id DESC
LIMIT ?;
3:使用子查询,可以先查出要的记录的id,然后再提取这些id的记录,这样的效率也可以
SELECT
a.id,
a.title,
a.cover_image,
a.publish_dt,
a.article_status,
a.create_time,
a.create_user_name,
a.create_user,
a.create_data_source,
a.intro,
a.view_count,
a.collect_count,
a.praise_count,
a.sort
FROM cms_article a
JOIN (SELECT id FROM cms_article ORDER BY id DESC limit ?,?) sub
on a.id = sub.id
4:业务上的优化,需要前端配合,比如当limit到1000以后,服务端一次返回500条或1000条记录,前端每次只展示10条20条,不需要一直与服务端做交互了,只是某一次查询的时候比较慢,这种就看业务是否能接受。
5:索引覆盖,查询的列如果时索引列,这样子不需要回表查性能也很高
6:参考一些市面上热门的产品,例如记录只限查询半年前或一年前的记录,再之后的记录就不能查询