0

次の表を考慮してください。

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 秒かかります。

これをより速く/より良くするにはどうすればよいですか?

4

1 に答える 1

1

解決策は実際には非常に簡単です。

SQL

SELECT
    COUNT(`rowid`) as `row_number`
FROM
    `my_table`
WHERE
    `group` = 1
AND
    `rowid` >= 6

ノート

増分値 (タイムスタンプ、増分 ID など) を持つ行が必要です。

ここでは、オリジナルORDER BY rowid DESCWHERErowidに変換し>= '6'ます。昇順を使用する場合は、代わりORDER BYに使用する必要があります。<=

クエリには 0.00002 秒かかり、正しい行番号が返されます ( row_number)。textとの列が必要な場合groupは、これをサブクエリにするか、 を選択する追加のクエリを作成する必要がありますWHERE rowid = 6

于 2012-12-18T16:10:36.930 に答える