Оптимизация автозаполнения для больших наборов данных - PullRequest
7 голосов
/ 07 января 2011

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

Три поля этой формы требуют значения из подмножества общего источника данных (таблица SQL). Я использовал JQuery и JQuery UI для создания автозаполнения, которое отправляет сообщения в общий HttpHandler.

Внутренне обработчик использует Linq-to-sql для получения данных, необходимых из этой конкретной таблицы. Таблица содержит около 10 различных столбцов, и выражение linq использует SqlMethods.Like () для сопоставления одного поискового запроса в каждом из этих 10 полей.

Проблема в том, что эта таблица содержит около 20 тыс. Строк. Автозаполнение работает безупречно, примите, что большой объем данных вводит ошибки, около 6 секунд или около того (при отладке на моем локальном компьютере), прежде чем он появится.

У автозаполнения JqueryUI есть задержка 0, запросы на клавишу 3, и результат публикации выполняется в многострочных опциях в стиле Facebook. (Мне почти пришлось переписать плагин автозаполнения ...).

Итак, проблема в скорости передачи данных. Любые мысли о том, как ускорить это? У меня были только две мысли: кэшировать данные (как / где?); или использовать для чтения данных прямой читатель sql?

Любые идеи будут с благодарностью! Спасибо,

<bleepzter/>

Ответы [ 2 ]

6 голосов
/ 07 января 2011

Я бы посмотрел только на возвращение первого числа X строк, используя метод .Take(10) linq.Это должно привести к вызову sensbile sql, который значительно снизит нагрузку на вашу базу данных.По мере того, как пользователь вводит, он находит все меньше и меньше совпадений, поэтому он видит только те данные, которые ему нужны.

Обычно я считаю, что 10 пунктов достаточно, чтобы пользователь понял, что происходит, и все еще получаетнеобходимые данные быстро (см., например, панель поиска amazon.com).

Очевидно, что если вы сможете отсортировать данные осмысленным образом, то 10 результатов с большей вероятностью дадут пользователю то, что онипосле быстро.

1 голос
/ 27 августа 2012

Вернуть N лучших результатов - это хорошая идея.Мы обнаружили (запрашивая потенциальный список из 270КБ), что возвращение топ-30 - это лучшая ставка для пользователя, который находит то, что он ищет, но что ПОЛНОСТЬЮ зависит от данных, которые вы запрашиваете.ДЕЙСТВИТЕЛЬНО следует уменьшить задержку до 100-300 мс.Когда вы устанавливаете задержку в ZERO, после того, как вы нажмете 3-символьный триггер, фактически КАЖДЫЙ.НЕ ЗАМУЖЕМ.KEY.ИНСУЛЬТ.отправляется как новый запрос на ваш сервер.Это может легко привести к непреднамеренному и нежелательному эффекту замедления ответа даже БОЛЬШЕ.

...