Выбор отдельного занимает много времени для большой базы данных - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть следующая таблица:

CREATE TABLE notes (noteId INTEGER PRIMARY KEY ASC, note, note_length, count, unique(note) on conflict abort)

Она содержит 3 миллиона строк.

Затем я выполняю следующую команду:

def getDistintNoteCountList(note_length):
   with sqlite3.connect(r'./note_database') as connection:
      cursor = connection.cursor()
      cursor.execute('select distinct count from notes where note_length = ?', [note_length])
      return [i[0] for i in cursor]

Однако требуется30 секунд для выполнения этой функции, когда возвращаемый список имеет размер около 20. Это разумно, учитывая, что у меня 3 миллиона записей или я что-то сделал неправильно?

Спасибо,

Барри

РЕДАКТИРОВАТЬ

Добавлено:

cursor.execute("create index countIndex on notes (count)")
cursor.commit()

И перезагрузить данные в базу данных.Кажется, все так же медленно.

Ответы [ 4 ]

2 голосов
/ 26 декабря 2011

Поскольку в запросе есть предложение where, включающее note_length, и для него требуется поле count, оптимальный индекс будет (note_length, count) в этом порядке. Кстати, это закрывающий индекс, но я не уверен, что sqlite может использовать его в этой ситуации.

Планирование sqlite запросов объясняется на этой странице

2 голосов
/ 26 декабря 2011

Решение проходит по оптимизации.

Создайте index на count, и это будет довольно быстро.

1 голос
/ 26 декабря 2011

Попробуйте создать сложный индекс не только для столбца count, но и для столбцов count и note_length.

0 голосов
/ 26 декабря 2011

Чтобы DISTINCT делал то, что он делает, он должен выполнить сортировку, чтобы удалить дубликаты. В зависимости от размера таблицы / запроса и того, какие индексы (если они есть) доступны, это часто может быть дорогостоящим шагом.

Я не эксперт по SQLlite, но если это вложенный запрос в цикле, который выполняется многократно, он будет жаловаться. Кроме того, это правильно выбрать SELECT DISTINCT COUNT? Конечно, COUNT возвращает только одно значение и по определению отличается?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...