Индексированный атрибут iOS Core Data не улучшает производительность - PullRequest
4 голосов
/ 01 апреля 2012

У меня база данных Core Data работает на iPad.В нем 30 000 контактов с такими атрибутами, как имя, фамилия и т. Д.

Производительность поиска невелика, если использовать NSCompoundPredicate.Я или два предиката LIKE (по имени и фамилии), и для поиска 30 000 контактов требуется около 1500 мс.Затем я попытался добавить свойство indexed к полям firstname и lastname (используя пользовательский интерфейс XCode Data Modeller), но производительность кажется абсолютно одинаковой.

После добавления свойства Indexed к двум полям я удалил всеобъекты из базы данных и заново ее заполнить.Нужно ли делать что-то еще для того, чтобы индексы начали использоваться, и стоит ли ожидать повышения производительности за счет индексации двух полей, используемых в составном предикате?

Я работаю нареальное устройство (iPad3).1500 мс для поиска по 30 000 контактных записей не кажется большим - это нормально для курса?

Большое спасибо.

1 Ответ

8 голосов
/ 02 апреля 2012

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

Многие приложения, в том числе и собственные, Apple, избегают этой проблемы, ограничивая поиск способами, которые пользователь не заметит. Например, поиск при наборе в приложении, таком как Контакты, на самом деле не хочет сопоставлять запрос со всеми возможными подстроками имен людей; вместо этого он соответствует людям, чье имя или фамилия начинаются с запроса.

Для дальнейшей оптимизации учтите также, что вы, вероятно, можете обойтись без полного подкованного в юникоде, с учетом регистра и диакритического соответствия соответствия, которое LIKE и BEGINSWITH дадут вам. Пример Apple DerivedProperty показывает, как вы можете получить гораздо лучшую производительность, сохраняя «нормализованную» (т. Е. Все тот же случай, без диакритических знаков, прочий посторонний материал) версию вашего поискового свойства и используя предикаты, основанные на лексикографическом порядке (например, normalizedLastName >= "foo" && normalizedLastName < "fop").

Более подробную информацию об этих и связанных трюках можно найти в некоторых сеансах Core Data из прошлых WWDC, особенно 2010 Сессия 137, «Оптимизация производительности базовых данных в iPhone OS» .

...