如何查询超过2亿行的表?

时间:2013-08-10 18:46:24

标签: mysql limit database-performance

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

关于如何解决这两个问题的任何想法?

谢谢, 纳塔利娅

1 个答案:

答案 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;

我不知道它是否会更快,但至少你没有明确地先排序行。

如果这些是您需要执行的查询类型,请考虑将订购信息作为列中的列包含的方法。