медленная, но быстрая загрузка на устройстве ios на симуляторе - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть база данных с 3 таблицами, имеющими 700000 записей в каждой.Я добавил функцию поиска в приложение, которое использует запрос ...

const char *sqlstatement="select * from artist where name like ?";
        sqlite3_stmt *compliedstatement;
        if(sqlite3_prepare_v2(database,sqlstatement , -1, &compliedstatement, NULL)==SQLITE_OK)
        {
            sqlite3_bind_text(compliedstatement,1,[[NSString stringWithFormat:@"%%%@%%",self.searchBar.text] UTF8String], -1, SQLITE_STATIC);

На симуляторе все было в порядке, но на устройстве iOS это заняло около минуты.Поэтому я использовал Sqlite Manager для добавления индексов к столбцам таблицы, размер базы данных вырос с 76 МБ до 166 МБ, но теперь этот запрос занимает от 1 до 2 секунд на симуляторе и около 10-15 секунд на устройстве.Так что это улучшение, но все же есть предложения по дальнейшему улучшению?НЕТ, я не могу использовать CoreData на данный момент.

Ответы [ 2 ]

1 голос
/ 09 марта 2015

Используйте функцию FTS в SQLite. FTS включен по умолчанию и будет решать проблему производительности запросов с помощью «лайка» Вам необходимо добавить все строки в виртуальную таблицу FTS. Затем используйте «матч» вместо «как». См. Здесь документацию: http://www.sqlite.org/fts3.html. Вы можете ожидать, что производительность будет в миллисекундах, а не в секундах.

1 голос
/ 29 февраля 2012

Первое, что нужно отметить, это то, что SQLite не будет использовать индекс для предложений LIKE, даже если они имеют форму LIKE '...%' (например, LIKE 'Fred%'), причем в большинстве последовательностей сопоставлениячувствительны к регистру.Наблюдаемое вами улучшение производительности связано с использованием SQLite так называемого поиска по индексу - он может выполнять поиск по индексу, а не просматривать всю таблицу.

15 секунд для 700 000 записей - это неплохо, вНа самом деле речь идет о том, что я получаю по очень похожему запросу.Чтобы добиться какого-либо улучшения в этом, вы должны изучить полнотекстовый поиск (FTS).Это включает в себя гораздо больше работы, чем простое добавление индекса, но это может быть путь для вас.

Если они запрашивают возвращает много строк, и вы используете их для заполнения табличного представления, тамможет быть другая проблема с производительностью из-за необходимости обрабатывать так много строк, даже если вы только извлекаете идентификаторы строк.Мое решение состояло в том, чтобы ограничить число извлекаемых строк примерно до 5000 на том основании, что никто не захочет прокручивать больше, чем это.

...