各種データベースページングクエリー方法

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メソッドで大量のデータをクエリーするときは速度が遅い
       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