3

我有一个只有一列的用户表USER_ID。这些ID超过200M,不连续,不排序。它在该列上有一个索引 USER_ID_INDEX。我在 MySQL 和 Google Big Query 中有数据库,但我无法在其中任何一个中获得我需要的东西。

我需要知道如何查询这两件事:

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。但是如果我想添加或删除一行,那将是一团糟。

关于如何解决这两个查询的任何想法?

谢谢,娜塔莉亚

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 回答