Вот так:
У меня есть большая таблица в моей базе данных – 3,6 ГБ и 1,7 М строк. Выбор с ограничением и смещением из таблицы очень медленный и часто приводит к ошибке 504. Таблица MyISAM, имеет несколько индексов и будет обновляться.
Вот почему я решил использовать Sphinx для отображения содержимого таблицы – в некоторых случаях без запроса (все строки), в некоторых случаях с запросом – и он работает как шарм. Скорость потрясающая.
Но вот проблема – без запроса возвращаются только первые 1000 результатов. Даже если я назову его с помощью $this->SetLimits(41, 24);
который должен вернуть мне результаты с идентификатором от 984
до 1008
, но последний результат, который я получаю, равен 1000. Я попытался изменить значение в моем /etc/sphinxsearch/sphinx.conf
, перезапустив службу, но не /etc/sphinxsearch/sphinx.conf
успеха. Кроме того, это хорошая идея? Я имею в виду, это заметно снизит производительность? Любые предложения о том, как это сделать?
И вот еще вопрос:
В моем sphinx.conf
я выбрал столбцы, которые я хочу использовать для поиска / заказа, и все они появляются в разделе [matches]
. Поскольку я их не использую, они берут память и (я думаю), уменьшают производительность до некоторой степени. Я использую только id
в своем приложении. Можно ли искать / упорядочивать эти столбцы, но исключать их из [matches]
?
Мой sphinx.conf
source test { type = mysql sql_host = localhost sql_user = root sql_pass = password sql_db = database sql_port = 3306 sql_query = \ SELECT id, name, UNIX_TIMESTAMP(date) as date, views, rating \ FROM table \ WHERE active = 1 sql_field_string = name sql_attr_timestamp = date sql_attr_uint = views sql_attr_uint = rating sql_query_info = SELECT * FROM table WHERE id=$id } index test { source = test path = /var/lib/sphinxsearch/data/test docinfo = extern charset_type = utf-8 } searchd { listen = 9312 log = /var/log/sphinxsearch/searchd.log query_log = /var/log/sphinxsearch/query.log read_timeout = 5 max_children = 30 pid_file = /var/run/sphinxsearch/searchd.pid max_matches = 10000 # I tried changing this to 10,000 - no result seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 binlog_path = /var/lib/sphinxsearch/data }
Это связано с тем, что также существует параметр max-matches для каждого запроса, и по умолчанию он равен 1000.
в sphinx.conf вы можете установить что-то вроде
max_matches = 10000
или, добавьте max_matches к вашему запросу
$this->SetLimits(41, 24, 10000);
Обратите внимание, что есть два места, где предел max_matches применяется. Ограничение по запросу контролируется этим вызовом API, но также существует ограничение на сервер, контролируемое параметром max_matches в файле конфигурации. Чтобы предотвратить злоупотребление ОЗУ, сервер не позволит установить лимит на один запрос выше, чем ограничение на сервер.
Во второй части смотрите функцию ->SetSelect()
.