方法1: 直接使用数据库提供的SQL语句
- 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N
- 适应场景: 适用于数据量较少的情况(元组百/千级)
- 原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.
- 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M
- 适应场景: 适用于数据量多的情况(元组数上万)
- 原因: 索引扫描,速度会很快. 有朋友提出: 因为数据查询出来并不是按照pk_id排序的 , 所以会有漏掉数据的情况 , 只能方法3
- 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
- 适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)
- 原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待...).
第一个问号表示pageNum , 第二个?表示每页元组数
- 语句样式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT * FROM 表名称 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M
- 适应场景: 大数据量
- 原因: 索引扫描,速度会很快. prepare语句又比一般的查询语句快一点 。
比如: 读第1000到1019行元组(pk是主键/唯一键).
比如(id是主键/唯一键,蓝色字体时变量)
利用子查询示例:
测试实验
1. 直接用limit start, count分页语句 , 也是我程序中用的方法:
如下:
从中我们也能总结出两件事情:
- limit语句的查询时间与起始记录的位置成正比
- mysql的limit语句是很方便 , 但是对记录很多的表并不适合直接使用 。
利用表的覆盖索引来加速分页查询
我们都知道 , 利用了索引查询的语句中如果只包含了那个索引列(覆盖索引) , 那么这种情况会查询很快 。
因为利用索引查找有优化算法 , 且数据就在查询索引上面 , 不用再去找相关的数据地址了 , 这样节省了很多时间 。另外Mysql中也有相关的索引缓存 , 在并发高的时候利用缓存就效果更好了 。
在我们的例子中 , 我们知道id字段是主键 , 自然就包含了默认的主键索引 。现在让我们看看利用覆盖索引的查询效果如何 。
这次我们之间查询最后一页的数据(利用覆盖索引 , 只包含id列) , 如下:
推荐阅读
- Python连接MySQL数据库方法介绍
- MySQL高压缩引擎TokuDB 揭秘
- 淘宝信誉分对应等级 淘宝的信誉等级怎么看等级从哪里找
- 常说的A级、B级、C级汽车是按什么分级的?
- 佛吉尼亚级战列舰 弗吉尼亚号装甲战列舰
- 世界上最黑的物质叫什么 世界上最黑的物质超级黑
- 部分华为手机本月可升级鸿蒙系统!万物互联时代要来了!
- 如何创建MySQL用户帐户和授予权限
- 四年级上语文专项复习题,认真练一练 四年级上册语文复习
- 对电视的画面声音不满意?专家教你轻松升级