mysql分页的问题
用过mysql的人肯定知道,mysql提供了原生的分页功能-----LIMIT关键字。LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。TIPS:初始记录行的偏移量是 0(而不是 1)。
但是我再实际的项目过程中使用LIMIT子句时,在分页数目很大的情况下(几万页),后面的翻页的速度明显慢于前面,特别好奇这个现象的原因,于是explain了一下,才发现mysql LIMIT 10000, 20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行。如下所示:
EXPLAIN SELECT * FROM exp_platform ORDER BY id DESC LIMIT 10000,5
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)
这相当于越往后面翻页越相当于全表扫描,这样在一个高并发的应用下,性能肯定是hold不住的。但是LIMIT n这样的语句性能是没有问题的,因为只扫描n行。于是就想找解决办法,如下:
Solution1:使用LIMIT n
"clue法":大概的思路就是在where语句根据id或者别的字段做一些限制。但是这个思路只能提供“上一页”、“下一页”这样的跳转,因为你需要拿到上一页或者下一页的id然后再根据where语句筛选,再使用LIMIT N来做。这样的话,不管翻多少页,每次查询只扫描20行。
SELECT * FROM exp_platform WHERE id >= 9500 LIMIT 5
Solution2:使用子查询
SELECT * FROM exp_platform WHERE id >= (SELECT id FROM exp_platform ORDER BY id LIMIT 10000, 1) LIMIT 20
子查询是在索引上完成的,而普通查询是在数据文件上完成的,通常来说,索引文件要比数据文件小很多,所以操作起来更有效
Solution3:使用JOIN分页方式,这个没有尝试过,有机会可以试试。
实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。
mysql分页的问题的更多相关文章
- Oracle、SQL Server、MySQL分页方法
测试用例:查询TEST_TABLE表中TEST_COLUMN列的第10-20条数据 1,Oracle分页方法 SELECT A.* FROM ( SELECT ROWNUM ROWNO, B.* FR ...
- MySql 分页
MySql 分页 由于最近项目需要,于是就简单写了个分页查询.总体而言MySql 分页机制较为简单.数据库方面只需要使用limit即可实现分页.前后台交互就直接用session传了值. 下面就写写具体 ...
- FluentData Mysql分页的一个BUG
开发环境 FluentData3.0.VS.NET2010.Mysql5.0 问题描述 使用FluentData对一个表(记录数28)进行分页时,突然发现一个诡异的问题,第一页返回10条数据正常,第二 ...
- Mysql 分页语句Limit用法
转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...
- php+mysql分页类的入门实例
php+mysql分页类的简单代码 时间:2016-02-25 06:16:26来源:网络 导读:php+mysql分页类的简单代码,二个php分页类代码,对商品进行分页展示,当前页面数,每个页面展示 ...
- sqlserver分页;mysql分页;orcale分页 的sql 查询语句
一,sqlserver分页: )) ID FROM 表名 AS 表名1_1 ORDER BY ID)) ORDER BY ID; 二:mysql分页 )*每页显示的数据条数,当前页码 * 每页显示的数 ...
- MySQL分页实现
mysql> select pname from product; +--------+ | pname | +--------+ | 产品1 | | 产品2 | | 产品三 | +--- ...
- MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...
- oracle和mysql分页
mysql分页 关键字limit,limit m,n 其中m表示起始位置的下标,下标从0开始.n表示要显示的条数,比如要查询一个表的第2到5条数据. ,; oracle分页 关键字rownum, ro ...
- EF获取多个数据集以及MySQL分页数据查询优化
背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...
随机推荐
- XCODE 控件连接(关联)不上变量 怎么解决
一个很低级的错误,原因就在于控件所属的UIViewController没有设置对应的CLASS, 即变量所属的class, 设置好即可解决. 解决办法: alt + command + 3进入身份检查 ...
- 【小技巧】C#的saveFileDialog和openFileDialog的用法总结
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- BFS,DFS伪代码
//bfs #define queue_init (head=tail=0) #define queue_is_empty (head==tail) #define en_queue(x) (queu ...
- Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)
Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...
- NFV FD.io VPP VM 系统性能调优
Host Setting: 1.关闭power savings mode在BIOS中 2.设置 /sys/devices/system/cpu/cpu*/cpufreq/scaling_governo ...
- 针对ie9写特殊的样式
<!--ie9样式重置--> <!--[if IE 9]> <style> select { background: none; padding-right: 0 ...
- 大学二三事——那些事(1)
虽然另外一个队友早上忽然拉肚子没有办法去了,我个阿骚还是决定出发. 本来以为早点过去签到可以躲过李导,没想到在她上班的路上被她撞见. 坐在早上那班发往周至县的客车的时候,天气忽好忽坏. 从周至 ...
- jQuery EasyUI的使用入门
jQuery EasyUI不是什么太高级的东西,就是用jQuery写了很多方法.定义了很多属性,通过调用这些方法.属性,可以达到一些特定的效果,然后我们再根据具体需求微调就好了.至少需要导入两个样式表 ...
- 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...
- 通过mvn archetype:generate创建Maven项目模板慢的问题
通过mvn archetype:generate这种交互方式来创建Maven项目模板的时候,经常会长时间卡在Generating project in Interactive mode这一行提示(图1 ...