如何在大型数据库中为sqlite中的datatable行分配索引?

如何在大型数据库中为sqlite中的datatable行分配索引?,sql,database,python-3.x,sqlite,Sql,Database,Python 3.x,Sqlite,我将sqlite与python一起使用。假设我有一个如下所示的数据表: Table 1 1 | 2 | 3 | 4 | 5 __|___|___|___|__ A | B | B | C | D B | D | B | D | C A | D | C | C | A B | D | B | D | C D | B | B | C | D D | B | B | C | D Table 1 Index| 1 | 2 | 3 | 4 | 5 _____|___|___

我将sqlite与python一起使用。假设我有一个如下所示的数据表:

     Table 1

1 | 2 | 3 | 4 | 5
__|___|___|___|__
A | B | B | C | D
B | D | B | D | C
A | D | C | C | A
B | D | B | D | C
D | B | B | C | D
D | B | B | C | D
        Table 1

Index| 1 | 2 | 3 | 4 | 5
_____|___|___|___|___|___
  23 | A | B | B | C | D
  32 | B | D | B | D | C
  106| A | D | C | C | A
  72 | B | D | B | D | C
  80 | D | B | B | C | D
  80 | D | B | B | C | D
问题:我如何为每一行创建一个索引列(非常快速/高效/适用于非常大的数据库),如果x行和y行相同,它们将被分配相同的索引?对于示例数据库,我希望如下所示:

     Table 1

1 | 2 | 3 | 4 | 5
__|___|___|___|__
A | B | B | C | D
B | D | B | D | C
A | D | C | C | A
B | D | B | D | C
D | B | B | C | D
D | B | B | C | D
        Table 1

Index| 1 | 2 | 3 | 4 | 5
_____|___|___|___|___|___
  23 | A | B | B | C | D
  32 | B | D | B | D | C
  106| A | D | C | C | A
  72 | B | D | B | D | C
  80 | D | B | B | C | D
  80 | D | B | B | C | D

我不在乎实际的索引是什么,只要重复的行(如示例中的最后两行)获得相同的索引。

如果您可以逐行解析文件,为什么不使用dict将行作为字符串或元组

my_dico = {}
index_counter = 1
with open(my_db) as my_database, open(out_file) as out:
    for row in my_database:
        my_row_as_a_tuple = tuple(row.strip().split())

        if my_row_as_a_tuple in my_dico:
            out.write(my_dico[my_row_as_a_tuple] + '<your separator>' + row)

        else:
            index_counter += 1
            out.write(str(index_counter) + '<your separator>' + row)
            my_dico[my_row_as_a_tuple] = str(index_counter)
my_dico={}
索引_计数器=1
使用open(my_db)作为my_数据库,将open(out_文件)作为out:
对于my_数据库中的行:
my_row_as_a_tuple=tuple(row.strip().split())
如果我的行作为我的dico中的一个元组:
out.write(我的dico[我的行作为一个元组]+“”+行)
其他:
索引_计数器+=1
out.write(str(索引计数器)+''+行)
my_dico[my_row_as_a_tuple]=str(索引计数器)

您可以创建一个由表中每个字段组成的索引

create index on table1 (field1, field2, field3, field4, field5)
但这可能不是个好主意。它制作了一个庞大的索引,它的构建和处理速度都很慢。某些数据库引擎不允许您在字段组合超过一定长度的情况下创建索引。我不确定sqllite中是否有这样的限制,或者它可能是什么

通常的做法是选择一些字段或少量字段的组合,这些字段可能很短且分布均匀

我所说的“short”是指字段中的数据只需要几个字节。它是一个int或一个小长度的varchar,varchar(4)或类似的东西。关于“short”的长度没有绝对的规则,但是您应该选择最短的字段。一个varchar(4000)将是一个糟糕的选择

我所说的“均匀分布”是指有许多不同的价值观。理想情况下,每一行都有一个唯一的值,即任何两行都没有相同的值。如果没有这样的字段,那么选择一个尽可能接近此字段的字段。有时2或3行共享一个值但很少超过该值的字段是好的。有一半记录都具有相同值的字段不可用


如果没有一个字段是均匀分布的,则可以在两个或三个字段的组合上创建索引。但是如果您使用的字段太多,您就开始打破“短”条件。

谢谢您的回答!但对于大型数据库来说,这不是非常低效吗?这取决于您所称的大型数据库,因为即使在个人计算机上,数百万行也应该可以。但没有什么能代替实际的,测试的。。。如果您担心速度或内存效率,纯python可能不是合适的工具。你可以检查PyPy,如果你想和Python一起停留,你可能想用C/C++或RIST之类的东西去低级。好的,那么我就用这个!还有一个问题:我的数据库是什么,输出文件是什么?您想将数百万行写入一个文件吗?通常这不是效率低下吗?为什么要在python中检查行?为什么不使用sql查询呢?这不是快了很多吗?我只是预测了我通常的工作条件,这意味着用python过滤大型csv文件。我不习惯使用sql,所以我无法回答抱歉…为什么实际上需要重复的行?您不能只使用一个具有不同行的表,以及一个包含原始表中该行的重复计数的列吗?