SQLite замедляется после миллионов строк, как ускорить? - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть одна таблица в SQLite, которая по существу имеет следующее:

id : integer (primary key)
name: text
timestamp: text
data1: integer
data2: integer
...
data6: integer

Мне нужно отфильтровать по имени и метке времени, поэтому у меня настроен индекс (name, timestamp).

При 100 000 000 строк SQLite сканирует запросы. Понимание индекса уменьшает временную сложность с O (n) до O (log n), но все еще кажется слишком медленным. Я предпочитаю не разбивать данные на несколько таблиц. Есть предложения?

Ответы [ 2 ]

4 голосов
/ 20 сентября 2010

Для хихиканья я создал базу данных sqlite3, содержащую схему OP, содержащую 100 000 000 строк, 6 ГБ неиндексированный файл базы данных с использованием текстовых меток дат.

При индексировании размер файла базы данных удваивается.С довольно пешеходной настольной машиной винтаж 2008 года (2 ГБ ОЗУ, 5 тыс. BogoMIPS) запрос

select * from big where date = "2010-09-20 04:54:45.586836"; 

вернул 10 тыс. Строк менее чем за 8 секунд времени настенных часов.Я надеюсь, что эти цифры полезны для сравнения.

4 голосов
/ 20 сентября 2010

Ваша временная метка должна быть числовой. Фильтрация по текстовому столбцу значительно замедлит ваши запросы из-за способа сравнения строк.

А если вы этого еще не сделали, поместите индексы в любой столбец, который отсортирован (ORDER BY) или отфильтрован (WHERE, HAVING, JOIN ON и т. Д.) .

И, наконец, порядок, в котором вы фильтруете свои данные, может иметь большое значение. Фильтрация по числовой метке времени, а затем по имени, как правило, будет значительно быстрее, чем фильтрация по имени, а затем по числовой метке времени. Попробуйте изменить порядок ваших выражений. Например, WHERE day = ?, month = ?, year = ? обычно будет намного быстрее, чем WHERE year = ?, month = ?, day = ?.

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