3

列が1つしかないテーブル USERS がありますUSER_ID。これらの ID は 200M を超えており、連続しておらず、順序付けられていません。その列にはインデックス USER_ID_INDEX があります。MySQL と Google Big Query に DB がありますが、必要なものを取得できませんでした。

これら2つのことを照会する方法を知る必要があります:

1)特定の行番号はどれですかUSER_ID(テーブルがによって並べ替えられたらUSER_ID

このために、私はMySQLで試しました:

SET @row := 0;
SELECT @row := @row + 1 AS row FROM USERS WHERE USER_ID = 100001366260516;

行カウントはデータセットからのものであるため、高速になりますが、行= 1を返します。

SELECT USER_ID, @row:=@row+1 as row FROM (SELECT USER_ID FROM USERS ORDER BY USER_ID ASC) WHERE USER_ID = 100002034141760

永遠にかかります(結果を見るのを待ちませんでした)。

BigQuery の場合:

SELECT ROW_NUMBER() OVER() row, USER_ID 
FROM (SELECT USER_ID from USERS.USER_ID ORDER BY USER_ID ASC)
WHERE USER_ID = 1063650153

永遠にかかります(結果を見るのを待ちませんでした)。

2)USER_ID特定の行にあるもの(テーブルがによって並べ替えられたらUSER_ID

このために、私はMySQLで試しました:

SELECT USER_ID FROM USERS ORDER BY USER_ID ASC LIMIT 150000000000, 1 

結果が出るまで5分かかります。なんで?インデックスがあれば速いはずではありませんか?

Big Query では、LIMIT init, num_rowsが存在しないため、方法が見つかりませんでした。

新しいテーブルでテーブルを注文し、その上に INDEX をRANK注文するという名前の列を追加できます。USER_IDしかし、行を追加または削除したい場合は混乱します。

これら2つのクエリを解決する方法についてのアイデアはありますか?

ありがとう、ナタリア

4

1 に答える 1

0

(1)については、これを試してください:

SELECT count(user_id)
FROM USERS
WHERE USER_ID <= 100001366260516;

を確認できますがexplain、インデックスのスキャンを実行しているだけです。

(2) の場合。あなたの質問: 「なぜですか? インデックスがあれば高速であるはずではありませんか?」. はい、インデックスを使用します。次に、インデックス スキャンを使用して 150,000,000,000 行までカウントする必要があります。うーん、それはテーブルの終わりです (タイプミスでなければ)。いずれにせよ、インデックス スキャンは高速なインデックス ルックアップとはまったく異なります。そして、時間がかかります。インデックスがメモリに収まらない場合は、さらに時間がかかります。

ちなみに、の適切な構文はrow_number()次のようになります。

SELECT row, USER_ID 
FROM (SELECT USER_ID, row_number() over (order by user_id) as row
      from USERS.USER_ID )
WHERE USER_ID = 1063650153;

それほど速くなるかどうかはわかりませんが、少なくとも最初に行を明示的に並べ替えていません。

これらの種類のクエリを実行する必要がある場合は、順序情報をテーブルの列として含める方法を検討してください。

于 2013-08-10T20:32:32.500 に答える