sqlite,用于在大型数据库中重新索引表的方法

时间:2018-03-24 19:48:00

标签: sqlite

我有一个包含一个表my_table的数据库,其中包含两亿行。它的结构如下:

index1 | column_one
______  _______
0      |AA
1      |AB
2      |CD
3      |FFF
4      |AA
...    |...
2902   |TF
....   |...

我面临的问题是,数据库非常庞大,需要几分钟才能完成所需的操作。我发现如果我重新索引my_table,例如:

,我可以更快地完成工作
 reindex  | index1 | column_one
 _________  ______  _______
  0       | 0      |AA
  1       | 1      |AB
  2       | 2      |CD
  3       | 3      |FFF
  0       | 4      |AA
  ...     | ...    |...
  8       | 2902   |TF
  ....    | ....   |...

这个'重新索引'值真的会拯救我,因为它给了我一个选项,可以在几毫秒内收到表中所需的信息,正是我需要的。但是我现在没有看到任何解决方案我怎么能做到这一点,考虑到表有2亿行,内存限制了我很多。

只是为了查看我与column_one有多少种不同的分类器:

SELECT count(distinct column_one) from my_table;

需要两分钟:)

1 个答案:

答案 0 :(得分:1)

可以通过计算所有较小的值来计算这个数字:

UPDATE MyTable
SET reindex = (SELECT COUNT(DISTINCT column_one)
               FROM MyTable AS T2
               WHERE T2.column_one < MyTable.column_one);

这会对每一行独立进行整数计数,因此效率不高。

按顺序检索所有值的列表可能更好:

SELECT DISTINCT column_one
FROM MyTable
ORDER BY column_one;

...然后使用列表中的索引更新每个此类值的表。