各種データベースページングクエリー方法
5434 ワード
具体的な実装では,使用するデータベース,データ量,実装ページング方式に基づいて,ページング実装が速い方式を選択する.
一、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方式より速い
二、DB 2ページングクエリー方法
DB 2ページングクエリ方法は主に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.クエリの第2層では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では、rownumrnを実行して行番号を生成し、order byソートを実行しますが、最終結果はrnすなわち行番号で取得され、order byソートは機能しません
//正しいやり方:先に並べ替えて、並べ替えた結果に対して行番号を生成して、rnによって結果を得て得たのは並べ替えた結果です
//正しい方法:もう1つ追加して並べ替える
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()方式--db 2方式
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()の3つの関数の組合せでページングクエリを行う.
skipメソッドで大量のデータをクエリーするときは速度が遅い
一、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方式より速い
二、DB 2ページングクエリー方法
DB 2ページングクエリ方法は主に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.クエリの第2層では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では、rownumrnを実行して行番号を生成し、order byソートを実行しますが、最終結果はrnすなわち行番号で取得され、order byソートは機能しません
//正しいやり方:先に並べ替えて、並べ替えた結果に対して行番号を生成して、rnによって結果を得て得たのは並べ替えた結果です
//正しい方法:もう1つ追加して並べ替える
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()方式--db 2方式
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()の3つの関数の組合せでページングクエリを行う.
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})
:https://www.cnblogs.com/lxfeng/p/4256502.html