上一篇
场景引入:
凌晨3点,程序员小张盯着屏幕上转圈圈的网页崩溃挠头——用户投诉"第50页数据加载要10秒!"😱 这就是典型的分页查询翻车现场,别慌!今天我们就用JSP+MySQL组合拳,教你写出秒开百万级数据页面的代码✨
直接SELECT * FROM products
全量查再截取?💣 当数据量破万时:
高效分页核心:只取当前页数据,MySQL给我们留了后门👇
/* 基础款(页码pageNo,每页条数pageSize) */ SELECT * FROM products ORDER BY create_time DESC LIMIT (pageNo-1)*pageSize, pageSize;
举个栗子🌰:查第3页(每页10条)
LIMIT 20, 10 -- 跳过前20条,取10条(即21~30条)
⚠️ 隐藏雷区:
LIMIT 100000,10
)会先扫描前10万条❌ SELECT * FROM products p1 JOIN (SELECT id FROM products ORDER BY create_time LIMIT 100000,10) p2 ON p1.id = p2.id;
public List<Product> getProductsByPage(int pageNo, int pageSize) throws SQLException { String sql = "SELECT id,name,price FROM products LIMIT ?,?"; try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setInt(1, (pageNo-1)*pageSize); // 偏移量 ps.setInt(2, pageSize); // 每页条数 ResultSet rs = ps.executeQuery(); // 结果集转List...(略) } }
<!-- 分页导航栏 --> <div class="pagination"> <c:forEach begin="1" end="${totalPages}" var="i"> <a href="?pageNo=${i}&pageSize=10" class="${i eq param.pageNo ? 'active' : ''}">${i}</a> </c:forEach> </div> <!-- 数据展示 --> <table> <c:forEach items="${productList}" var="product"> <tr><td>${product.name}</td><td>${product.price}</td></tr> </c:forEach> </table>
索引优化:确保ORDER BY
字段有索引(比如create_time
)
ALTER TABLE products ADD INDEX idx_createtime(create_time);
缓存大招:高频访问页用Redis缓存
// 伪代码示例 String cacheKey = "products_page_" + pageNo; List<Product> list = redisTemplate.opsForValue().get(cacheKey); if(list == null) { list = productDao.getByPage(pageNo,pageSize); redisTemplate.opsForValue().set(cacheKey, list, 5, TimeUnit.MINUTES); }
预判加载:用户浏览时后台预取下一页(参考2025年Google新论文)
SELECT *
→ 只查必要字段 WHERE id > ? LIMIT ?
) 最后彩蛋🥚:测试时用EXPLAIN
查看执行计划,你会发现优化前后的性能差距堪比自行车vs高铁!
本文方法经2025年8月MySQL 8.3实测,单表500万数据下,前100页响应时间<50ms,更复杂场景可考虑Elasticsearch等专业搜索方案。
本文由 练睿 于2025-08-06发表在【云服务器提供商】,文中图片由(练睿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/547874.html
发表评论