Советы по повышению эффективности индексирования sqlite - PullRequest
3 голосов
/ 07 декабря 2009

В моем приложении для iPhone есть база данных sqlite, доступ к которой осуществляется через инфраструктуру Core Data. Я использую NSPredicates для запроса базы данных.

Я создаю функцию поиска, которая должна искать в шести различных полях varchar, содержащих текст. На данный момент это очень медленно, и мне нужно улучшить производительность, вероятно, в базе данных sqlite. Будет ли лучше создать индекс для всех этих столбцов? Или было бы лучше создать пользовательскую индексную таблицу, в которой эти шесть столбцов будут разбиты на несколько строк, каждая из которых будет содержать слово и соответствующий ему идентификатор? Любые другие предложения?

Ответы [ 4 ]

5 голосов
/ 08 декабря 2009

Есть вещи, которые вы можете сделать, чтобы улучшить производительность поиска текста в базах данных sqlite. Хотя базовые данные абстрагируют вас от основного хранилища, было бы полезно оценить, что происходит, когда резервное копирование вашего хранилища выполняется с помощью sqlite.

Если мы предполагаем, что вы выполняете поиск по этим полям по подстроке, есть способы, которые вы можете сделать, чтобы улучшить производительность поиска. Apple рекомендует использовать производные свойства. Это означает сохранение нормализованной версии вашего свойства в вашей модели, которая используется для поиска. Производное свойство должно быть сделано так, чтобы его можно было проиндексировать. Затем вы выражаете свой поиск в терминах этого производного свойства, используя бинарные операторы> <= и т. Д. </p>

Я обнаружил, что в результате этого наш поиск сократился с 1 секунды до 100 мс.

Чтобы прояснить ситуацию, я бы предложил посмотреть пример АЦП http://developer.apple.com/mac/library/samplecode/DerivedProperty/

2 голосов
/ 08 декабря 2009

Из Руководство по программированию основных данных :

Как вы можете использовать предикаты значительно повлиять на производительность вашего приложения. Если принести запрос требует составного предиката, Вы можете сделать выборку более эффективной гарантируя, что наиболее ограничительный Предикат является первым, особенно если предикат включает в себя сопоставление текста (содержит, заканчивается, как и соответствует), так как правильный Юникод поиск идет медленно Если предикат сочетает в себе текстовые и нетекстовые сравнения, то, вероятно, будет более эффективно указать нетекстовые предикаты в первую очередь, для пример (зарплата> 5000000) И (lastName LIKE 'Quincey') лучше чем (фамилия, как "Квинси") И (зарплата> 5000000).

Если есть способ изменить порядок запроса таким образом, чтобы самая простая логика была слева, а самая сложная справа, это могло бы повысить эффективность поиска. Как предполагает Лион, поиск текста в Юникоде чрезвычайно дорог, поэтому Apple рекомендует выполнять поиск по производным значениям, которые отбрасывают символы Юникода и общие фразы, такие как, и, и.

1 голос
/ 08 декабря 2009

Если вам нужна, по сути, полнотекстовая индексация вашей базы данных sqlite, то вы можете использовать модуль sqlite ft3, поскольку это именно то, что он предоставляет: http://www.sqlite.org/cvstrac/wiki?p=FtsUsage http://dotnetperls.com/sqlite-fts3

1 голос
/ 08 декабря 2009

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

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