LIMIT句
取り出すデータの数や開始位置の条件を追加する
MySQLとPostgreSQL以外はLIMIT句がないので同様の処理をする場合は次のようにすると高速で処理できます。
11件目から5件を抽出する場合、テーブルから10件を除いたものから上位の5件を抽出する手法です。
SELECT TOP 5 table_name.id, table_name.name FROM table_name
WHERE NOT EXISTS
(SELECT * FROM
(SELECT TOP 10 * FROM table_name) AS ex_table_name
WHERE table1.id = ex_table_name.id)
);
ORDER BY table_name.id
WHERE NOT EXISTS
(SELECT * FROM
(SELECT TOP 10 * FROM table_name) AS ex_table_name
WHERE table1.id = ex_table_name.id)
);
ORDER BY table_name.id
上位10件までのテーブルex_table_nameを作成し、それを全体のテーブルから除いています。
SQL_CALC_FOUND_ROWS・FOUND_ROWS()
LIMIT句と同時にLIMIT句を付けなかった場合の全レコード数を調べることができます。 LIMIT句の付いたSELECT文にSQL_CALC_FOUND_ROWSを付けた直後にFOUND_ROWS()を行うと全レコード数が取得できます。
SELECT SQL_CALC_FOUND_ROWS * FROM table_name WHERE 〜〜 LIMIT 0,10
SELECT FOUND_ROWS();
SELECT FOUND_ROWS();
ページナビなどを付けるときには1度の問い合わせで終わるのでいいかもしれません。
またLIMIT句を付けなかった場合でも使用でき、このときはcount(*)と同じ意味になります。調べた結果、countよりも問い合わせ速度が1.7倍ほど高速化されるようです。
これを使わなかった場合に1文でのSQL文の例
SELECT * FROM (
SELECT * FROM table_name WHERE 〜〜
) AS `gt`,(
SELECT COUNT(`c`) AS `allrows` FROM (
SELECT 1 AS `c` FROM (
SELECT * FROM table_name WHERE 〜〜
) AS `gt`
) AS `gt` GROUP BY `c`
) AS `gt2`
LIMIT 0,10
SELECT * FROM table_name WHERE 〜〜
) AS `gt`,(
SELECT COUNT(`c`) AS `allrows` FROM (
SELECT 1 AS `c` FROM (
SELECT * FROM table_name WHERE 〜〜
) AS `gt`
) AS `gt` GROUP BY `c`
) AS `gt2`
LIMIT 0,10
SELECT * FROM table_name WHERE 〜〜の部分は同じものです。
対応SQL
- MySQL
- PostgreSQL
書式などが異なる