Реализация разбиения результатов поиска в MySQL - PullRequest
0 голосов
/ 21 февраля 2011

Это должно быть довольно распространенной проблемой.Я не мог найти решение в базе данных вопросов stackoverflow.Я не уверен, что выполнил правильный поиск.

Я использую сайт MySQL, CGI / Perl.Может быть 1000 хитов в день.Пользователь может искать базу данных для веб-сайта.Предложение where может стать довольно длинным.Я отображаю 10 элементов на странице и даю пользователю ссылки для перехода на следующую и предыдущую страницы.В настоящее время я выполняю новый поиск, каждый раз, когда пользователь нажимает ссылку «предыдущая» или «следующая».Я использую

LIMIT num-rows-to-fetch OFFSET num-rows-to-skip

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

Если вы можете дать мне несколько советов, я был бы очень признателен.

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Если вы не возражаете против использования Javascript, вам следует проверить DataTables . Таким образом, вы отправляете все строки клиенту, а разбиение на страницы выполняется на стороне клиента.

Если это не вариант, вы можете попробовать использовать mod_perl или CGI :: Session, чтобы сохранить результат запроса между запросами страницы, поэтому вам не нужно будет снова и снова запрашивать mysql.

0 голосов
/ 23 февраля 2011

Я никогда не использовал этот модуль, поэтому не могу ручаться за его производительность, но взгляните на DBI :: ResultPager

0 голосов
/ 21 февраля 2011

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

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

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