次の表を考慮してください。
rowid | text | group
1 | a | 1
2 | b | 2
3 | c | 2
4 | d | 3
5 | e | 4
6 | f | 1
7 | g | 1
8 | h | 4
9 | j | 5
10 | k | 2
11 | i | 3
12 | l | 3
ここで、行番号 6 が必要だと想像してくださいrowid
(ページネーションなどで使用するため)。自動インクリメントなので、選択するのは非常に簡単ですが、この場合、グループ 1 にwhere rowid = 6
ある行番号を知りたいです。
明らかに、このような小さな例 (行番号 2) では、目でこれを行うのは簡単です。
行番号 1 は になりますrowid = 1
。行番号 2 は になりますrowid = 6
。行番号 3 は になりますrowid = 7
。
私の最初の考えは次のようなものでした:
SELECT
tmp.rowid,
tmp.text,
tmp.group,
tmp.row_number
FROM
(
SELECT
`rowid`,
`text`,
`group`,
(@rowNumber := @rowNumber + 1) as `row_number`
FROM
`my_table`,
(SELECT @rowNumber := 0) as `r`
WHERE
`group` = 1
ORDER BY
`rowid` DESC
) as `tmp`
WHERE
tmp.rowid = 6
これにより正しい結果が得られrow_number
ますが (50 万レコード)、大きなテーブル (50 万レコード) では、最初に 500,000 エントリすべてを収集し、次に行 ID 6 を選択する必要があるため、高速サーバーでは 2.5 秒かかります。
これをより速く/より良くするにはどうすればよいですか?