mysql行番号クエリーとページング


開発の過程でmysqlデータベースに対してマルチテーブルカスケードクエリーを行う必要があります.ここでは、ページングクエリーのパフォーマンスを向上させるためにmysqlのクエリー行番号が使用されます.
1.mysqlページングクエリー
通常のmysqlページングクエリーでは、limitキーワードを使用できます.
SELECT * FROM table ORDER BY id LIMIT 1000, 10;

limitキーワードを使用してmysqlのページングクエリーを実現するには便利ですが、データ量が大きくなるとlimitキーワードを使用してページングを行う効率は望ましくありません(limitのページング効率は最初のパラメータに関係し、データ量が大きくなるとlimitの最初のパラメータが大きくなり、ページング効率が低下します).
mysqlのページング・クエリーの効率を向上させるには、次の方法を使用します.
SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

SELECT * FROM table WHERE id IN(10000, 100300, 1000020...); 

前者は連続データに対するページング処理であり、後者は非連続データに対するページング処理(ページングが必要なid番号を先に見つけ出す)である.
2.実際の問題
実際の開発では,従来のページングは連続的にページングされていたが,sqlカスケードクエリを修正した後にページングされたデータが連続しなくなったため,従来のページング方式を修正したくないために,不連続データに対してもBETWEEN,ANDキーワードでページングロジックを実現することが望ましい.
この効果を達成するために,行番号が連続していることを考え,行番号をページングすることで目的を達成できる.
3.mysqlの行番号
mysqlではrownoの取得は変数でしか取得できません.一般的な形式は次のとおりです.
SELECT @rowno:=@rowno+1 as rowno,r.* from t_article r,(select @rowno:=0) t

既存のsqlに行番号を追加する場合は、次のようにします.
SELECT @rowno:=@rowno+1 as rowno, O.* from (old_sql) O,(select @rowno:=0) t

old_sqlは以前からあったsqlですが、上のsqlの中では元のsqlが新しい表に見えます
4.mysqlの行番号によるページング
この効果を実現するには、行番号に基づいてページを分割したsqlにページ条件を追加すれば簡単です.
select P.* from (SELECT @rowno:=@rowno+1 as rowno, O.* from (old_sql) O,(select @rowno:=0) t) P where rowno between ? and ?

order byなどの条件はold_に含まれるべきであることに注意してください.sql中