2013-03-27 2 views
0

Мы прототипировали систему результатов поиска для базы данных mySQL с примерно 2 миллионами имен и адресов и 3 миллионами записей подписки и регистрации конференций.Лучший способ ускорить отображение результатов поиска

В настоящий момент выполняется поиск и все результаты возвращаются - для каждого результата я затем выполняю второй запрос для поиска подписки/конференций для уникального идентификатора человека. У меня есть индексы на всех важных столбцах, и отдельные запросы выполняются довольно быстро в phpMyAdmin (0.0xxx секунд), но передают это на отображаемую веб-страницу (PHP, выгружается с использованием DataTables), и страница занимает секунды для рендеринга. Мы попытались перенести данные в базу данных Lucene, и это похоже на LIGHTNING, но узкое место все же, по-видимому, отображает результаты, а не извлекает их.

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

Я мало думаю и часто спрашиваю с помощью AJAX/серверной подкачки, возможно, это путь сюда (возможно, получить 50 результатов, запрос меньше, страница меньше и может быть отправлена ​​быстрее), но я приветствую любые предложения, которые, возможно, у вас есть.

+0

Можете ли вы предоставить любые образцы sql/информацию о EXPLAIN/schema, включая индексы? Скорее всего, второй запрос ограничивает вас, так как миллисекунды скоро складываются. –

+0

Вы пытались выполнить его без «DataTables» – Rob

+0

@ Simonatmso.net - вот пример запроса поиска кого-то по имени: http://pastebin.com/DWscK2Y4 - в этом вопросе поиска подписки есть намного больше, чем нужно потому что тот же запрос используется в другом месте в системе. Можете написать отдельную меньшую версию только для результатов поиска. – MikkyX

ответ

2

Даже если вы используете разбивку на страницы с DataTables, все результаты будут загружены в исходный код страницы на первый, хотя вы используете server side feature.

Загрузка 2 миллиона строк сразу всегда будет оказывать медленно. Вы должны пойти на разбиение страницы на стороне сервера, это может быть AJAX или обычным PHP-скриптом.

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

+0

Что-то вроде поиска в представлении, возможно, и синхронизации этого представления наугад? Я не возвращаю все 2 миллиона строк каждый раз, но верно, что количество результатов может превышать пять цифр ..., что представляет собой много данных для того, чтобы сервер отображал браузер сразу. Чем больше я думаю об этом, тем более очевидным представляется, что меньшие результаты - это немедленное улучшение. – MikkyX

+0

Просто возьмите в качестве примера любой большой веб-сайт. Ни один из них не загружает этот объем данных одновременно. Разбиение на страницы и сортировка по серверной стороне и поиск автозаполнения по AJAX, если нет, POST. – Alvaro

+0

Правда.Любые рекомендации для системы кэширования, которые могли бы сделать трюк? Я уже размышлял о том, обновляется ли mySQL View, иногда обновляется (новые записи добавляются каждые несколько минут, обновления реже - в реальном времени не VITALLY важно) может быть лучше для этого - ваши мысли? – MikkyX

Смежные вопросы