高效分页查询的核心是使用LIMIT和OFFSET,但大偏移量时性能差。最佳实践:使用子查询或覆盖索引实现深分页。例如:SELECT * FROM table WHERE id > (SELECT id FROM table ORDER BY id LIMIT offset) ORDER BY id LIMIT pagesize; 这避免了全表扫描。JSP中结合PreparedStatement预编译SQL,设置fetchSize优化结果集检索。
CSDN博客
在MySQL中,传统分页SQL是SELECT * FROM table ORDER BY id LIMIT offset, pagesize; 当offset很大时,如第10000页,会扫描前10000条记录,非常慢。优化方案一:记录游标分页,使用last_id:SELECT * FROM table WHERE id > last_id ORDER BY id LIMIT pagesize; 方案二:使用延迟关联:SELECT a.* FROM table a,(SELECT id FROM table ORDER BY id LIMIT offset,pagesize) b WHERE a.id = b.id;
StackOverflow讨论
For JSP with MySQL pagination, use PageHelper plugin for MyBatis, it's efficient. But for pure JDBC, prepareStatement with parameters: String sql = "SELECT * FROM users WHERE active=1 ORDER BY ? LIMIT ?, ?"; ps.setString(1, "name"); ps.setInt(2, offset); ps.setInt(3, limit); This prevents SQL injection and caches the plan.
开发者论坛热议
性能优化:总是用WHERE条件过滤前加索引,避免SELECT * 用具体字段。JSP检索技巧:用Connection.setAutoCommit(false)批量查询后commit,减少事务开销。热议:DEEP分页用id范围查询比OFFSET快10倍,有人测试百万数据提升到毫秒级。
知乎专栏
JSP数据库检索:用ResultSet.TYPE_FORWARD_ONLY和CONCUR_READ_ONLY,设置resultSet.setFetchSize(100); 减少内存占用。MySQL分页最佳实践:建复合索引(id,create_time),SQL:SELECT * FROM table FORCE INDEX(idx) WHERE ... ORDER BY id,create_time LIMIT ? OFFSET ?;
博客园文章
开发者分享:jsp分页用Google的Guava库split list,但数据库端优化优先。代码示例:public List
阿里云开发者社区
最佳实践:MySQL 8.0用窗口函数ROW_NUMBER() OVER(ORDER BY id)实现分页,但兼容性差。推荐:应用层缓存热门页,数据库用EXPLAIN分析慢查询,优化JOIN顺序。JSP技巧:用ThreadLocal存DataSource避免每次getConnection。
FAQ
Q: 为什么OFFSET分页慢?
A: 因为MySQL要扫描offset前的所有行再丢弃。
Q: JSP怎么防SQL注入?
A: 始终用PreparedStatement绑定参数。
Q: 深分页怎么优化?
A: 用WHERE id > last_id ORDER BY id LIMIT size。
Q: 索引对分页影响大吗?
A: 是,ORDER BY字段必须索引覆盖。