本文 的 原文 地址
尼恩说在前面:
在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、shopee、百度、网易的面试资格,遇到很多很重要的面试题:
mysql 深度翻页太慢,如何解决?
深度分页为什么会影响性能?有什么优化方案?
前几天 小伙伴面试 京东,遇到了这个问题。但是由于 没有回答好,导致面试挂了。
小伙伴面试完了之后,来求助尼恩。
遇到mysql 深度翻页这个问题,该如何才能回答得很漂亮,才能 让面试官刮目相看、口水直流。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
单表场景,limit深度分页存在的严重性能问题
大家的业务接口,常常是分页接口。
这样的接口,如果碰到深度分页,都会有慢sql性能问题, 而且会引发 非常严重的 线上 故障。
一个小伙伴反馈,他们公司今年3月份时候,线上发生一次大事故:
-
第一阶段:后端服务器发生宕机,所有接口超时。
-
第二阶段:宕机半小时后,又自动恢复正常。
-
第三阶段:但是过了2小时,又再次发生宕机。
通过接口日志定位,发现MySQL数据库无法响应服务器,出现 大量的 深度翻页的 慢sql:
-
当 接口 数据 被刷到7000多页,偏移量(
offset)高达20w多。 -
每当这条SQL执行时,数据库CPU直接打满。
-
查询时间超过1分钟才有响应。
总之,由于慢查询导致数据库CPU使用率爆满,其他业务的数据库请求无法得到及时响应,两个结果:
- 接口超时。
- 最后,拖垮主服务器。
所以说,老架构师尼恩提示大家一定当心:limit深度分页存在的严重性能问题。
MySQL Limit 语法格式
Limit 是一种常用的分页查询语句,它可以指定返回记录行的偏移量和最大数目 。
先来看看 MySQL Limit 语法格式。
分页查询时,我们会在 LIMIT 后面传两个参数,一个是偏移量(offset),一个是获取的条数(rows)。
SELECT column1, column2, ...
FROM table_name
WHERE condition
LIMIT rows OFFSET offset;
或者
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
SELECT column1, column2, ...
FROM table_name
WHERE con

最低0.47元/天 解锁文章
1836

被折叠的 条评论
为什么被折叠?



