MySQL分頁
主要是MySQL數據庫內置LIMIT函數
注意添加mysql的JAR包mysql-connector-java-5.1.13-bin.jar
select * from table LIMIT 5,10; // 檢索記錄行 6-15
在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引。隨着數據量的增加,頁數會越來越多,查看后幾頁的SQL就可能類似:
select * from content order by id desc limit 10000, 10
一言以蔽之,就是越往后分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。
此時,我們可以通過2種方式:
一,子查詢的分頁方式來提高分頁效率
為什么會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在數據文件上完成的,通常來說,索引文件要比數據文件小得多,所以操作起來也會更有效率。
經過飄易的實測,使用子查詢的分頁方式的效率比純LIMIT提高了14-20倍!
二,JOIN分頁方式
經過我的測試,join分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。
MySQL分頁Java實現
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="gbk"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>MySQL分頁</title> </head> <body> <table> <tr> <td>用戶名</td> <td>所在城市</td> <td>職業</td> </tr> <% //加載驅動 Class.forName("com.mysql.jdbc.Driver"); //得到連接 Connection ct = DriverManager.getConnection( "jdbc:mysql://localhost:3306/tour", "root", "root"); Statement sm = ct.createStatement(); //接收pageNow參數 String s_pageNow = request.getParameter("pageNow"); int pageNow = 1; if (s_pageNow != null) { pageNow = Integer.parseInt(s_pageNow); } //查詢總頁數 int pageCount = 0;//當前為第幾頁 int pageSize = 3;//每頁顯示幾條記錄 int rowCount = 0;//總共有多少條記錄 ResultSet rs = sm.executeQuery("select count(*) from users"); if (rs.next()) { rowCount = rs.getInt(1); if (rowCount % pageSize == 0) { pageCount = rowCount / pageSize; } else { pageCount = rowCount / pageSize + 1; } } rs = sm.executeQuery("select * from users limit "+ ((pageNow - 1) * pageSize + 1) +","+pageNow* pageSize+""); while (rs.next()) { out.println("<tr>"); out.println("<td>" + rs.getString(2) + "</td>"); out.println("<td>" + rs.getString(5) + "</td>"); out.println("<td>" + rs.getString(6) + "</td>"); out.println("</tr>"); } out.println("<tr>"); //打印總頁數 for (int i = 1; i < pageCount; i++) { out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i + "頁" + "</a>"); } out.println("</tr>"); rs.close(); sm.close(); ct.close(); %> </table> </body> </html>
Oracle分頁
主要是3層的嵌套查詢
注意添加Oracle的JAR 包classes12.jar
經典的SQL語句(用ROWNUM實現)
select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal) a1 where rownum<=10) where rn >=6;
Oracle分頁java實現
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="gbk"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Oracle分頁</title> </head> <body> <table> <tr> <td>用戶名</td> <td>職業</td> <td>薪水</td> </tr> <% //加載驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); //得到連接 Connection ct = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "SCOTT", "scott"); Statement sm = ct.createStatement(); //接收pageNow參數 String s_pageNow = request.getParameter("pageNow"); int pageNow = 1; if (s_pageNow != null) { pageNow = Integer.parseInt(s_pageNow); } //查詢總頁數 int pageCount = 0;//當前為第幾頁 int pageSize = 3;//每頁顯示幾條記錄 int rowCount = 0;//總共有多少條記錄 ResultSet rs = sm.executeQuery("select count(*) from emp"); if (rs.next()) { rowCount = rs.getInt(1); if (rowCount % pageSize == 0) { pageCount = rowCount / pageSize; } else { pageCount = rowCount / pageSize + 1; } } rs = sm.executeQuery("select * from (select a1.*,rownum rn from (select * from emp ) a1 where rownum<=" + pageNow * pageSize + ") where rn >=" + ((pageNow - 1) * pageSize + 1) + ""); while (rs.next()) { out.println("<tr>"); out.println("<td>" + rs.getString(2) + "</td>"); out.println("<td>" + rs.getString(3) + "</td>"); out.println("<td>" + rs.getString(6) + "</td>"); out.println("</tr>"); } out.println("<tr>"); //打印總頁數 for (int i = 1; i < pageCount; i++) { out.println("<a href=index.jsp?pageNow=" + i + ">" + "第" + i + "頁" + "</a>"); } out.println("</tr>"); rs.close(); sm.close(); ct.close(); %> </table> </body> </html>