Подтвердить что ты не робот

Производительность Android SQLite с индексами

Мое приложение для Android работает с использованием базы данных SQLite, созданной на ПК пользователя и переданной на устройство. Все это работает, но я не ожидал количества пользователей, у которых было бы действительно огромное количество данных. В этих случаях пользовательский интерфейс очень медленный, так как он ожидает получения данных.

Я пробовал несколько трюков, которые я "уверен" ускорил бы, но ничего, похоже, не имеет заметного эффекта. Мои запросы почти все очень просты, обычно это один "col = val" для предложения WHERE и данные INTEGER в столбце. Поэтому я не могу много сделать с запросами.

Последний, и я вовсе не эксперт SQL, должен был использовать команды "CREATE INDEX" на ПК, полагая, что эти индексы используются для ускорения поиска в базе данных. Индексы значительно увеличили размер файла базы данных, поэтому я был удивлен, что он, казалось, не повлиял на скорость моего приложения! Экран, который занимал 8 секунд для заполнения без индексов, по-прежнему занимает около 8 секунд даже с ними. Я надеялся довести дело до половины.

На данный момент мне интересно, может ли реализация SQLite на Android использовать индексы базы данных, или если я просто теряю пространство, создавая их. Кто-нибудь может ответить на этот вопрос?

Кроме того, какие-либо другие вещи, чтобы попытаться ускорить доступ?

(Для того, что стоит, на абсолютной основе пользователям не на что жаловаться. У моего наихудшего пользователя до сих пор есть данные, которые генерируют 630 000 записей (15 таблиц), поэтому возможно только так!)

Дуг Гордон Системы GHCS

4b9b3361

Ответ 1

Наконец-то я смог добиться огромных успехов в производительности, просто обратившись к базе данных гораздо более эффективно. Например, при создании массива информации я ранее запрашивал базу данных для каждой строки, которая мне нужна, с селектором типа "WHERE _id = n". Но делая это таким образом, я выпускал дюжину или более запросов, по одному за раз.

Вместо этого теперь создаю список требуемых идентификаторов, а затем получаю их все с одним запросом формы "WHERE _id IN (n1, n2, n3,...)" и итерации по возвращенному курсору, Выполняя эту и некоторые другие оптимизации структуры, самая большая база данных теперь почти так же быстро просматривается, как более средний случай.

Ответ 2

SQLite будет использовать индекс, если он подходит для запроса. Используйте EXPLAIN

EXPLAIN QUERY PLAN ... your select statement ...

чтобы узнать, какие индексы используют SQLite. План запроса основан на некоторых предположениях относительно вашего содержимого базы данных. Возможно, вы сможете улучшить план, используя ANALYZE

Ответ 3

Каждый раз, когда вы собираетесь выполнять какое-либо действие (это поиск базы данных, долговременный расчет, веб-запрос и т.д.), занимающий более пары сотен миллисекунд, вы должны рассмотреть возможность его переноса внутри AsyncTask.

Безболезненная Threading - хорошая статья по этой теме, поэтому я рекомендую вам внимательно ознакомиться с ней.

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