CoreData. В чем разница между индексами и индексированными?
Я пытаюсь ускорить запросы к моему экземпляру CoreData с поддержкой SQL (отображение записей, отсортированных по дате). Я знаю, что индексирование может помочь уменьшить время запроса, но в чем разница между:
Выделите объект, которому принадлежит атрибут, затем добавьте список атрибутов через запятую в поле индексов, как показано здесь:
Или выделив атрибут, затем отметив индексированное поле, как показано здесь:
2 ответа
Добавление строки с одним атрибутом Indexes
список эквивалентен выбору Indexed
для этого атрибута: он создает индекс для атрибута, чтобы ускорить поиск в операторах запроса.
Indexes
список предназначен для составных индексов. Составные индексы полезны, когда вы знаете, что будете искать значения этих атрибутов, объединенные в WHERE
пункт запроса:
SELECT * FROM customer WHERE surname = "Doe" AND firstname = "Joe";
Это утверждение может использовать составной индекс surname, firstname
, Этот индекс также будет полезен, если вы просто ищете surname
, но не если вы только ищете firstname
, Представьте индекс как телефонную книгу: сначала он сортируется по фамилии, а затем по имени. Так что порядок атрибутов важен.
В вашем случае вы должны сначала перейти на отдельные индексы (то есть выбрать Indexed
для атрибутов, которые вы хотели бы искать). Составной индекс, который вы показали, никогда не сможет быть использован, если вы просто ищете babyId
, например.
На WWDC 2017 яблоко обновило это, чтобы сделать это, используя Fetch Index
(см.: https://developer.apple.com/videos/play/wwdc2017/210/?time=997) Чтобы добавить его, выберите объект и перейдите к Editor
-> Add Fetch Index