我有一个只有一列USER_ID
的表USERS。这些ID超过200M,它们不是连续的,也没有订购。它在该列上有一个索引USER_ID_INDEX。我在MySQL和谷歌大查询中都有数据库,但我还没有能够得到我需要的任何内容。
我需要知道如何查询这两件事:
1)特定USER_ID
的行号是什么(一旦表格按USER_ID
排序)
为此,我在MySQL中尝试过:
SET @row := 0;
SELECT @row := @row + 1 AS row FROM USERS WHERE USER_ID = 100001366260516;
它变快但返回row = 1,因为行计数来自数据集。
SELECT USER_ID, @row:=@row+1 as row FROM (SELECT USER_ID FROM USERS ORDER BY USER_ID ASC) WHERE USER_ID = 100002034141760
这需要永远(我没有等到看到结果)。
在大查询中:
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
,甚至不存在。
我可以在新表中订购该表,然后添加一个名为RANK
的列,该列对USER_ID
进行排序,并在其上加上INDEX。但如果我想添加或删除一行,那将是一团糟。
关于如何解决这两个问题的任何想法?
谢谢, 纳塔利娅
答案 0 :(得分: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;
我不知道它是否会更快,但至少你没有明确地先排序行。
如果这些是您需要执行的查询类型,请考虑将订购信息作为列中的列包含的方法。