具体实现中,根据所用数据库、数据量、实现分页方式,选择分页实现快的方式实现。
一、MYSQL分页查询方法
MYSQL分页查询主要使用其自带的limit函数,但需根据查询量来决定具体的使用方式,如只有几千或几万数据,则直接用 limit m,n方式,
如数据量较多,则要注意limit的使用方式。
// limit m , n:从第 m 条数据开始,获取 n 条数据
1、数据量少的方式:select * from tablename limit m,n;
// limit m , n:m 可省略,省略或默认从结果集的第 0 条 开始
2、数据量多的方式:
// 从490000开始取10条
a. select * from tablename where id>=(select id from tablename limit 490000,1) limit 10 ;
b. select * from tablename limit 490000,10 ;
a 方式要比 b方式快
二、DB2分页查询方法
DB2分页查询方法主要以 rownumber() over() 函数方式实现,如下:
select * from(select 字段1,字段2...rownumber() over(order by id desc) as rn from tablename where...) as t1
where t1.rn between m and n / t1.rn >m and t1.rn <= n;
三、ORACLE分页查询方法
ORACLE分页查询主要以rownum关键字和rownumber() over()函数实现,如下:
1、rownum关键字--无排序--获取 n 到 m条数据
a. 在查询的第二层通过ROWNUM <= m 来控制最大值,在查询的最外层控制最小值:
select * from (
select a.*, rownum rn from (
select * from tablename) a
where rownum <= m)
where rn >= n
b. 直接在最外层控制最大值最小值
select * from (
select a.*, rownum rn from (
select * from tablename) a)
where rn between n and m
//在绝大多数情况下,a方式要比b方式快的多
2、rownum关键字--需排序--获取 n 到 m条数据
// 错误方式
select * from
(select t.*,rownum rn from mytable t order by t.id) b
where b.row_num between n and m
//错误原因:上面sql会先执行 rownum rn产生行号,再 执行order by 排序,但是最后结果通过rn即行号获取,order by排序不起作用
// 正确做法:先排序,对排序后的结果生成行号,则根据rn获取结果获取到的是排序后的结果
//正确方式:再加一层先排序
select * from
(select a.*, rownum rn from (select * from tablename order by id)a)b
where b.rn between n and m
3、rownum() over()方式--同db2方式
select * from(select 字段1,字段2...rownumber() over(order by id desc) as rn from tablename where...) as t1
where t1.rn between m and n / t1.rn >m and t1.rn <= n;
四、SQL SERVER分页查询方法
sql server 2005及以上版本,可用 rownum() over()方式实现
不可用rownum() over()方式版本用top关键字方式实现
select top num * from tablename where ..........
五、MONGODB分页查询方法
mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的
用skip方法查询大量数据的时候速度慢
page1 = db.things.find().limit(20)
page2 = db.things.find().skip(20).limit(20)
page3 = db.things.find().skip(40).limit(20)
find(查询条件),skip(跳过多少条数据),limit(查询多少条数据),sort(排序依据):sort({"age":1})1--正序,-1--反序
MySQL对应mongodb:
查询:
MySQL:SELECT * FROM user
Mongo: db.user.find()
MySQL:SELECT * FROM user WHERE name = ‘starlee‘
Mongo: db.user.find({‘name‘ : ‘starlee‘})
插入:
MySQL:INSERT INOT user (`name`, `age`) values (‘starlee‘,25)
Mongo:db.user.insert({‘name‘ : ‘starlee‘, ‘age‘ : 25})
删除:
MySQL:DELETE * FROM user
Mongo:db.user.remove({})
MySQL:DELETE FROM user WHERE age < 30
Mongo:db.user.remove({‘age‘ : {$lt : 30}})
更新:
MySQL:UPDATE user SET `age` = 36 WHERE `name` = ‘starlee‘
Mongo:db.user.update({‘name‘ : ‘starlee‘}, {$set : {‘age‘ : 36}})
MySQL:UPDATE user SET `age` = `age` + 3 WHERE `name` = ‘starlee‘
Mongo:db.user.update({‘name‘ : ‘starlee‘}, {$inc : {‘age‘ : 3}})
==============others=======================
MySQL:SELECT COUNT(*) FROM user WHERE `name` = ‘starlee‘
Mongo:db.user.find({‘name‘ : ‘starlee‘}).count()
MySQL:SELECT * FROM user limit 10,20
Mongo:db.user.find().skip(10).limit(20)
MySQL:SELECT * FROM user WHERE `age` IN (25, 35,45)
Mongo:db.user.find({‘age‘ : {$in : [25, 35, 45]}})
MySQL:SELECT * FROM user ORDER BY age DESC
Mongo:db.user.find().sort({‘age‘ : -1})
MySQL:SELECT DISTINCT(name) FROM user WHERE age > 20
Mongo:db.user.distinct(‘name‘, {‘age‘: {$lt : 20}})
MySQL:SELECT name, sum(marks) FROM user GROUP BY name
Mongo:
db.user.group({
key : {‘name‘ : true},
cond: {‘name‘ : ‘foo‘},
reduce: function(obj,prev) { prev.msum += obj.marks; },
initial: {msum : 0}
});
MySQL:
SELECT name FROM user WHERE age < 20
Mongo:db.user.find(‘this.age < 20‘, {name : 1})