MySQL 的分页查询 SQL 语句
MySQL一般使用 LIMIT 实现分页。基本语句为:
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。
举例来说,如果实际SQL类似下面语句,那么在 category_id, id两列上建立复合索引比较好:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10 ;
随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似下面这种:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10;
可以看出,越往后分页,LIMIT 语句的偏移量就会越大,速度也会明显变慢。此时,我们可以通过子查询的方式来提高分页效率:
SELECT * FROM articles WHERE id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1)
AND category_id = 123 ORDER BY id LIMIT 10;
还可以通过 JOIN 方式来实现分页查询:
SELECT * FROM articles AS t1
JOIN (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) AS t2
WHERE t1.id >= t2.id AND t1.category_id = 123 ORDER BY t1.id LIMIT 10;
为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。
实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。
下面是实际中三种方式的使用:
SELECT * FROM CommodityInfo WHERE commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 0,2; SELECT * FROM CommodityInfo WHERE id >=
(SELECT id FROM CommodityInfo WHERE commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 0, 1)
AND commodityid='ZMCOMD342161018143038124' ORDER BY id LIMIT 2; SELECT * FROM CommodityInfo AS t1
JOIN (SELECT id FROM CommodityInfo WHERE commodityid = 'ZMCOMD342161018143038124' ORDER BY id LIMIT 0, 1) AS t2
WHERE t1.id >= t2.id AND t1.commodityid='ZMCOMD342161018143038124' ORDER BY t1.id LIMIT 2;
MySQL 的分页查询 SQL 语句的更多相关文章
- Oracle 的分页查询 SQL 语句
Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM T ...
- Oracle分页查询sql语句
1. select * from ( select t.*, rownum RN from TABLE_NAME t ) where RN > 0 and RN <= 15 2. se ...
- Oracle和MySql的分页查询区别和PL/SQL的基本概念
Oracle和MySql的分页查询区别: Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...
- 分页用到的子查询sql语句
说明(2017-8-31 23:30:22): 1. 分页用到的子查询sql语句 select * from(select *,ROW_NUMBER() over(order by id)as num ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM ...
- 说说oracle分页的sql语句
说说oracle分页的sql语句,分排序和不排序两种. 当结果集不需要进行排序时,每页显示条数为:rowPerPage,当前页数为:currentPage. 1. 相对来说,这种查询速度会快一些,因为 ...
- 查询sql 语句的好坏
要找出mysql中低效的sql语句我们可以使用 EXPLAIN分析低效sql,但是在使用 EXPLAIN之前我需要开启mysql慢查询日志,这样才可以使用 EXPLAIN,下面我们一起来看看. 面对业 ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
随机推荐
- Django学习(一)
Django 是python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站.(emmmm,百度百科).本学期需要做python数据的可视化,之前搞过两次SMM和SSH,但是之后ja ...
- 给没有连接因特网的centos使用yum安装其他软件。
在centos上,使用yum安装软件很方便,比如安装gcc,java等, 但是在没有网络的情况下呢? 我之前就碰到过这么一个问题,在一个没有外网的环境内,我需要安装GCC等工具, 然后有人推荐我先去其 ...
- vim的简单使用以及一些常用的命令
对于第一次用vi,有几点注意要提醒一下:1.用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字.切换方法:在「命令行模式 ...
- [转] vue异步处理错误
Vue.prototype.$await = async function(action) { try { await action(); } catch (err) { // 这里是你处理错误的逻辑 ...
- .Net Core Web/Console 下使用Nlog
.Net Core Console 下使用Nlog 官方介绍: https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-C ...
- C#如何拦截 Webbrowser Control的响应内容
场景目标 假如Webbrowser中的一个页面打开后第一件事就是执行了alert,我们想要阻止它该如何做? <html> <head> <script src=" ...
- json随笔
<script> var obj2={};//这只是JS对象 var obj3={width:100,height:200};/*这跟JSON就更不沾边了,只是JS的对象 */ var o ...
- Python数据分析-知识宝藏
0.SQL数据库 1. python基础知识 2. 重点工具掌握:数据解析核心技巧 - Numpy| Pandas| Matplotlib 3. 数据特征分析:分布| 对比| 统计| 帕累托| 正态| ...
- sql查询单表之中大于2条的数据
SELECT COUNT(字段)AS COUNT,字段FROM 表名 GROUP BY 字段 HAVING COUNT >=
- event、fly.js、购物车特效
先总结下区别: #鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条. event.clientX.event.clientY #鼠标相对于document文档区域的x ...