Как я могу эффективно выполнять поиск данных в базе данных, кроме использования полного поиска - PullRequest
2 голосов
/ 13 февраля 2009

Я хочу найти предложение (словосочетание) в некоторой таблице или представлении БД. Я не хочу использовать Fultext search свойство DB. Есть ли альтернативный эффективный способ?

Ответы [ 4 ]

2 голосов
/ 13 февраля 2009

Без использования индекса база данных должна выполнить «полное сканирование таблицы». Это похоже на то, что вы просматриваете книгу по одной странице за раз, чтобы найти то, что вам нужно.

При этом компьютеры намного быстрее людей. Это действительно зависит от того, сколько нагрузки ваша система имеет. Используя MySQL, мы успешно внедрили поисковую систему в таблицу ведущей информации. Природа проблемы была та, которая не могла быть решена обычными индексами (включая полный текст). Таким образом, мы разработали его для питания с использованием полного сканирования таблицы.

Это включало создание как можно более узких таблиц с данными поиска и объединение их в более крупную таблицу со связанными, но не поисковыми данными.

В то время (4 года назад) 100 000 записей можно было сканировать за 0,06 секунды. 1 000 000 записей заняли около 0,6 секунд. Система все еще активно используется с миллионами записей.

Если ваши данные должны превышать 6 цифр записей, вы можете пересмотреть их, используя полнотекстовый индекс, или провести некоторое исследование по инвертированным индексам.

Пожалуйста, прокомментируйте, если вам нужна дополнительная информация.


Редактировать: Таблицы поиска были максимально узкими. В идеале 50-100 байт на запись. ENUMS и TINYINT - отличные средства экономии пространства, если вы можете использовать их для «сопоставления» строковых значений другим способом.

Поисковые запросы были сгенерированы с использованием класса PHP. Они были просто:

-- DataTable is the big table that holds all of the data
-- SearchTable is the narrow table that holds the bits of searchable data

SELECT 
  MainTable.ID, 
  MainTable.Name, 
  MainTable.Whatever 
FROM 
  MainTable, SearchTable 
WHERE 
  MainTable.ID = SearchTable.ID 
  AND SearchTable.State IN ('PA', 'DE')
  AND SearchTable.Age < 40
  AND SearchTable.Status = 3

По сути, две таблицы были объединены по первичному ключу (быстро), а фильтрация выполнялась путем полного сканирования таблицы в таблице поиска (довольно быстро). Мы использовали MySQL.

Мы обнаружили, что, имея формат записи == "FIXED" в таблицах MyISAM, мы можем увеличить производительность в 3 раза. Это означало, что не было ни капель, ни вархаров, и т.д ...

Дайте мне знать, если это поможет.

2 голосов
/ 13 февраля 2009

Никто не эффективнее полнотекстового поиска.

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

1 голос
/ 13 февраля 2009

Если вы используете JAVA, посмотрите на Lucene

Если вы используете .net, вы можете взглянуть на Lucene.net , это сведет к минимуму обращения к базе данных для поисковых запросов.

Исходя из http://incubator.apache.org/lucene.net/

Lucene.Net является исходным кодом, класс-на-класс, API-на-API и алгоритмический порт Java Lucene поисковая система для C # и .NET платформа с использованием Microsoft .NET Фреймворк.

Lucene.Net придерживается API и классы, используемые в оригинальной Java реализация Lucene. API имена, а также имена классов сохраняется с намерением дать Lucene.Net внешний вид C # язык и .NET Framework. За Например, метод Hits.length () в реализация Java теперь читает Hits.Length () в порту C #.

В дополнение к API и классам порт на C #, алгоритм Java Lucene портирован на C # Lucene. это означает индекс, созданный с помощью Java Lucene совместим с предыдущими версиями с C # Lucene; как при чтении, написание и обновление. На самом деле Lucene Индекс можно искать одновременно и обновляется с помощью Java Lucene и C # Люценовые процессы.

0 голосов
/ 16 февраля 2009

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

Пожалуйста, спросите, нужна ли вам дополнительная информация?

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