最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL基本分页查询方法及其优化_MySQL

来源:动视网 责编:小采 时间:2020-11-09 20:14:12
文档

MySQL基本分页查询方法及其优化_MySQL

MySQL基本分页查询方法及其优化_MySQL:今天将一个oracle的数据库生成到了mySQL,因为代码比较原始,是JDBC访问数据库的,所以,对数据库的分页查询一下子就查不出来了。小忧伤( ⊙ o ⊙ )啊! 先看下之前查询的code: public PageModel findUserList(int pageNo,int pag
推荐度:
导读MySQL基本分页查询方法及其优化_MySQL:今天将一个oracle的数据库生成到了mySQL,因为代码比较原始,是JDBC访问数据库的,所以,对数据库的分页查询一下子就查不出来了。小忧伤( ⊙ o ⊙ )啊! 先看下之前查询的code: public PageModel findUserList(int pageNo,int pag
 今天将一个oracle的数据库生成到了mySQL,因为代码比较原始,是JDBC访问数据库的,所以,对数据库的分页查询一下子就查不出来了。小忧伤( ⊙ o ⊙ )啊!

先看下之前查询的code:

public PageModel findUserList(int pageNo,int pageSize) {
	StringBuffer sbSql=new StringBuffer();
	sbSql.append("Select user_id,user_name,password,contact_tel,email,create_date ")
	.append("From")
	.append("(")
	.append("Select rownum rn,user_id,user_name,password,contact_tel,email,create_date ")
	.append("From")
	.append("(")
	.append("Select user_id,user_name,password,contact_tel,email,create_date from t_user where user_id <> 'root' ")
	.append(" order by user_id")
	.append("	)where rownum <=?")
	.append(") where rn>?");
	Connection conn=null;
	PreparedStatement pstmt=null;
	ResultSet rs=null;
	PageModel pageModel=null;
	try{
	conn=DbUtil.getConnnection();
	pstmt=conn.prepareStatement(sbSql.toString());
	pstmt.setInt(1, pageNo*pageSize);
	pstmt.setInt(2, (pageNo-1)*pageSize);
	rs=pstmt.executeQuery();
	List userList=new ArrayList();
	while(rs.next()){
	User user=new User();
	user.setUserId(rs.getString("user_id"));
	user.setUserName(rs.getString("user_name"));
	user.setPassword(rs.getString("password"));
	user.setContactTel(rs.getString("contact_tel"));
	user.setEmail(rs.getString("email"));
	user.setCreateDate(rs.getTimestamp("create_date"));
	userList.add(user);
	}
	pageModel=new PageModel();
	pageModel.setList(userList);
	pageModel.setTotalRecords(getTotalRecords(conn));
	pageModel.setPageNo(pageNo);
	pageModel.setPageSize(pageSize);
	}catch(SQLException e){
	DbUtil.close(rs);
	DbUtil.close(pstmt);
	DbUtil.close(conn);
	}
	return pageModel;
	}

基本上跟以前sql server数据库的rownum方式差不多。但是mysql这样子就不行了,要使用limit来进行分页。

先来看下我的表结构:

PS:我在user_id上面加了个索引。

然后,使用没有经过优化的limit进行查询:

 #create INDEX rowindex on t_user(user_id)
	SELECT * from t_user ORDER BY USER_ID DESC limit 0,2

然后我们对此进行优化查询:

1,使用子查询方式进行优化查询

SELECT
	*
	FROM
	t_user
	WHERE
	USER_ID < =(
	SELECT
	USER_ID
	FROM
	t_user
	ORDER BY
	USER_ID DESC
	LIMIT ($page-1)*$pagesize.", 1),
	1
	)
	ORDER BY
	USER_ID DESC
	LIMIT $pagesize
	
	例如:

	
	SELECT
	*
	FROM
	t_user
	WHERE
	USER_ID < =(
	SELECT
	USER_ID
	FROM
	t_user
	ORDER BY
	USER_ID DESC
	LIMIT 3,
	1
	)
	ORDER BY
	USER_ID DESC
	LIMIT 3

二,使用join方式进行优化

SELECT
	*
FROM
	t_user AS u1
JOIN (
	SELECT
	user_id
	FROM
	t_user
	ORDER BY
	USER_ID DESC
	LIMIT ($page-1)*$pagesize.", 1),
	1
) AS u2

示例:

	SELECT
	*
	FROM
	t_user AS u1
	JOIN (
	SELECT
	user_id
	FROM
	t_user
	ORDER BY
	USER_ID DESC
	LIMIT 0,
	1
	) AS u2

三,对返回的数据总条数查询的优化

通常在代码里面,我要分页的话,需要返回的结果集中,包含数据总条数,这样我才能够根据当前的pageSize来在页面上显示数据一共有多少页。

而对这个数据总条数的查询,我们通常使用count(*) 或者count(0),然而在mysql里面,提供了内置的函数,来对这一查询进行优化:

 SELECT SQL_CALC_FOUND_ROWS * from t_user where USER_ID<'root' limit 1;
	SELECT FOUND_ROWS(); #返回的第二个结果集为如果没有limit限制返回的条数

文档

MySQL基本分页查询方法及其优化_MySQL

MySQL基本分页查询方法及其优化_MySQL:今天将一个oracle的数据库生成到了mySQL,因为代码比较原始,是JDBC访问数据库的,所以,对数据库的分页查询一下子就查不出来了。小忧伤( ⊙ o ⊙ )啊! 先看下之前查询的code: public PageModel findUserList(int pageNo,int pag
推荐度:
标签: 方法 查询的 mysql
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top