【问题标题】:How to assign indexes to your datatable rows in sqlite in large databases?如何为大型数据库中的 sqlite 中的数据表行分配索引?
【发布时间】:2018-09-07 11:33:12
【问题描述】:

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

     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

问题:如何为每行创建(非常快速/有效/可行)索引列,如果 x 行和 y 行相同,它们会被分配相同的索引?对于示例数据库,我想要这样的东西:

        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

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

【问题讨论】:

  • 为什么你实际上需要重复的行?您不能只使用具有不同行的表,以及具有原始表中该行重复计数的列吗?

标签: sql database python-3.x sqlite


【解决方案1】:

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

create index on table1 (field1, field2, field3, field4, field5)

但这可能不是一个好主意。它创建了一个巨大的索引,构建速度很慢,处理速度也很慢。某些数据库引擎不允许您创建字段组合超过一定长度的索引。我不确定sqllite是否有这样的限制或可能是什么。

正常的做法是选择一些可能较短且分布良好的字段或少量字段的组合。

我所说的“短”字面意思很简单,字段中的数据只占用几个字节。它是一个长度较小的 int 或 varchar,varchar(4) 或类似的。关于“短”有多短没有绝对的规则,但您应该选择最短的其他合适的字段。 varchar(4000) 将是一个糟糕的选择。

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

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

【讨论】:

    【解决方案2】:

    如果您可以逐行解析文件,为什么不使用 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)
    

    【讨论】:

    • 感谢您的回答!但这对于大型数据库来说是不是非常低效?
    • 取决于你所说的大,因为几百万行即使在个人计算机上也应该没问题。但没有什么可以代替实际的,测试...如果您担心速度或内存效率,纯 python 可能不是正确的工具。如果你想继续使用 python,你可以检查 pypy,否则你可能想使用 c / c++ 或 rust 之类的低级。
    • 好的,那我就用这个!还有一个问题:my_db 是什么,out_file 是什么?是否要将数百万行写入文件?
    • 一般来说这不是效率低下吗?为什么要检查 python 中的行?为什么不使用 sql 查询呢?这不是快很多吗?
    • 我只是预测了我通常的工作条件,这意味着在 python 中过滤大型 csv 文件。我不习惯使用 sql,所以我无法回答抱歉...
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2021-02-10
    • 1970-01-01
    • 2014-03-12
    • 2018-11-11
    • 1970-01-01
    • 2021-05-23
    • 2018-09-03
    相关资源
    最近更新 更多