Как назначить индексы для строк данных в sqlite в больших базах данных? - PullRequest
0 голосов
/ 07 сентября 2018

Я использую 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

Вопрос: Как создать (очень быстро / эффективно / жизнеспособно для очень больших баз данных) столбец индекса для каждой строки, где, если строка 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

Мне все равно, каковы фактические индексы, если дублирующиеся строки (как и две последние в примере) получают одинаковый индекс.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы МОЖЕТЕ создать индекс, составленный из каждого поля в таблице.

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

Но это, вероятно, не очень хорошая идея. Это делает огромный индекс, который будет медленно строить и медленно обрабатывать. Некоторые движки баз данных не позволяют создавать индекс, в котором комбинация полей имеет определенную длину. Я не уверен, есть ли такой предел в sqllite или что это может быть.

Обычная вещь, которую нужно сделать, это выбрать какое-то поле или комбинацию небольшого количества полей, которые, вероятно, будут короткими и хорошо распределенными.

Под «коротким» я подразумеваю буквально и просто, данные в поле занимают всего несколько байтов. Это int или varchar с небольшой длиной, varchar (4) или что-то подобное. Не существует абсолютного правила относительно того, насколько коротким является «короткий», но вы должны выбрать самое короткое подходящее поле. Varchar (4000) был бы плохим выбором.

Под «хорошо распределенным» я подразумеваю, что существует много разных значений. В идеале каждая строка имеет уникальное значение, то есть не существует значения, которое было бы одинаковым для любых двух строк. Если такого поля нет, то выберите поле, максимально приближенное к этому. Поле, в котором иногда 2 или 3 строки имеют общее значение, но редко больше, чем это хорошо. Поле, в котором половина записей имеет одно и то же значение, не является.

Если нет ни одного хорошо распределенного поля, вы можете создать индекс по комбинации двух или трех полей. Но если вы используете слишком много полей, вы начинаете нарушать условие "short".

0 голосов
/ 07 сентября 2018

Если вы можете анализировать ваш файл строка за строкой, почему бы не использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...