Производительность Android SQLite с индексами - PullRequest
23 голосов
/ 28 ноября 2010

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

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

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

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

Также, есть ли другие способы ускорить доступ?

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

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

Ответы [ 3 ]

11 голосов
/ 06 декабря 2010

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

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

10 голосов
/ 29 ноября 2010

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

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

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

4 голосов
/ 28 ноября 2010

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

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

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

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