mysql分页查询语句

MySQL高效分页解决方案集

旧时模样 提交于 2019-11-30 21:06:58
很久以前的一次面试中,被面试官问到这个问题,由于平时用到的分页方法不多,只从索引、分表、使用子查询精准定位偏移以外,没有使用到其它方法。 后来在看其它博客看到了一些不同的方案,也一直没有整理。今天有时间,整理出来,分享给大家。 一,最常见MYSQL最基本的分页方式: select * from content order by id desc limit 0, 10 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似: select * from content order by id desc limit 10000, 10 一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。 此时,我们可以通过2种方式: 一,子查询的分页方式来提高分页效率,飘易用的SQL语句如下: SELECT * FROM `content` WHERE id (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize 为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多

数据量很大,分页查询很慢,怎么优化?

北战南征 提交于 2019-11-30 14:34:33
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。 下面简单说一下我知道的一些方法。 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增。 数据量:5709294 MySQL版本:5.7.16 线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试。以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果: 1 select count(*) from orders_history; 返回结果:5709294 三次查询时间分别为: 8903 ms 8323 ms 8401 ms 一般分页查询 一般的分页查询使用简单的 limit 子句就可以实现。limit 子句声明如下: 1 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于指定

PHP MySQL数据分页

最后都变了- 提交于 2019-11-30 09:46:23
SQL SELECT语句查询总是可能导致数千条记录。但是在一个页面上显示所有结果并不是一个好主意。因此,我们可以根据要求将此结果划分为多个页面。分页意味着在多个页面中显示您的查询结果,而不是仅将它们全部放在一个长页面中。MySQL通过使用LIMIT子句帮助生成分页,该子句将采用两个参数。第一个参数为OFFSET,第二个参数应从数据库返回多少条记录。下面是一个使用LIMIT子句获取记录以生成分页的简单示例。 <html> <head> <title>PHP分页</title> </head> <body> <?php $dbhost = 'localhost'; // 数据库主机 $dbuser = 'root'; // 用户名 $dbpass = '123456'; // 密码 $rec_limit = 10; // 每页10条数据 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error()); } mysqli_select_db($conn,'test'); // 要操作的数据 /* 获取所有的记录数 */ $sql = "SELECT COUNT(id) FROM test "; $retval = mysqli_query( $conn,

mysql原生分页

放肆的年华 提交于 2019-11-30 04:19:10
select * from table limit (pageNo-1)*pageSize, pageSize; 一:分页需求: 客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下: 比如: 查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10; 查询第10条到第20条的数据的sql是:select * from table limit 10,20; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10; 查询第20条到第30条的数据的sql是:select * from table limit 20,30; ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10; 二:通过上面的分析,可以得出符合我们自己需求的分页sql格式是:select * from table limit

数据量很大,分页查询很慢,怎么优化?

有些话、适合烂在心里 提交于 2019-11-29 20:57:07
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。 下面简单说一下我知道的一些方法。 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增。 数据量:5709294 MySQL版本:5.7.16 线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试。以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果: select count(*) from orders_history; 返回结果:5709294 三次查询时间分别为: 8903 ms 8323 ms 8401 ms 一般分页查询 一般的分页查询使用简单的 limit 子句就可以实现。limit 子句声明如下: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于指定

数据量很大,分页查询很慢,优化方案

試著忘記壹切 提交于 2019-11-29 05:37:05
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明。 1、表名:order_history 2、描述:某个业务的订单历史表 3、主要字段:unsigned int id,tinyint(4) int type 4、字段情况:该表一共37个字段,不包含text等大型数据,最大为varchar(500),id字段为索引,且为递增。5、数据量:5709294 6、MySQL版本:5.7.16 线下找一张百万级的测试表可不容易,如果需要自己测试的话,可以写shell脚本什么的插入数据进行测试。 以下的 sql 所有语句执行的环境没有发生改变,下面是基本测试结果: select count(*) from orders_history; 返回结果:5709294 三次查询时间分别为: 8903 ms 8323 ms 8401 ms 一般分页查询 一般的分页查询使用简单的 limit 子句就可以实现。limit 子句声明如下: select * from table LIMIT [offset,] rows | rows OFFSET offset LIMIT

MySQL实现分页查询

守給你的承諾、 提交于 2019-11-29 03:26:41
limit 基本实现方式 一般情况下,客户端通过传递 pageNo(页码)、pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit 来解决这个问题: 收到客户端{pageNo:1,pagesize:10} select * from table limit (pageNo-1)*pageSize, pageSize; 收到客户端{pageNo:5,pageSize:30} select * from table limit (pageNo-1)*pageSize,pageSize; eg.从id开始的10条数据 建立主键或者唯一索引 在数据量较小的时候简单的使用 limit 进行数据分页在性能上面不会有明显的缓慢,但是数据量达到了 万级到百万级 sql语句的性能将会影响数据的返回。这时需要利用主键或者唯一索引进行数据分页; 假设主键或者唯一索引为 good_id 收到客户端{pageNo:5,pagesize:10} select * from table where good_id > (pageNo-1)*pageSize limit pageSize; –返回good_id为40到50之间的数据 基于数据再排序 当需要返回的信息为顺序或者倒序时,对上面的语句基于数据再排序。order by ASC

转Oracle、MySql、SQLServer 数据分页查询

落花浮王杯 提交于 2019-11-27 04:20:14
最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一)、 mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:其实的索引 * pageSize:每页显示的记录数 */ select o.* from (sql) o limit firstIndex,pageSize 如下面的截图,每页显示的记录数为20: 查询(1-20)这20条记录 查询(21-40)这20条记录 mysql的分页查询就这么简单...... (二)、sqlserver2005的分页查询 在sqlserver2005之前一直借助top关键字来实现分页查询,不过效率低,在sqlserver2005及其之后的版本都使用row_number()解析函数来完成分页查询,效率有了很大的提高,不过sql语句比较复杂,下面给出分页查询的通式: /* * firstIndex:起始索引 * pageSize:每页显示的数量 * orderColumn:排序的字段名 * sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句 */ select top pageSize o.* from

数据库查询返回特定结果即分页查询

元气小坏坏 提交于 2019-11-27 01:24:35
1 几种不同数据库的不同的分页写法: a mysql a) 查询前n条记录 select * from table_name limit 0,n b) 查询第n条到第m条 select * from table_name limit n,m b oracle a)查询前n条记录 select * from table_name where rownum b)查询第m条到第n条记录: select * from (select a.*,a.rownum rn from table_name where rownum<n) where rn>m c sqlserver a)查询前n条记录: select top n * from table_name; b)查询第n条到第m条记录: select top n * from (select top m * from table_name order by column_name) a order by column_name desc 2 oracle rownum的用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。 (1) rownum 对于等于某值的查询条件