Ограничение на число рзультатов поика в БД

mfl
На сайте с 16.10.2006
Offline
134
mfl
648

В общем, используется полнотекстовый поиск по БД.

Для навигации по страницам определяется количество всех найденных строк с помощь "SQL_CALC_FOUND_ROWS"

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

Можно ли каким либо образом ограничить число всех результатов поиска?

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#1

Что хоть за база?

Неизменность точки зрения неизменно порождает иллюзию понимания.
[Удален]
#2

limit?

Если требуется, чтобы при поиске выдавались не все найденные записи, а определенная группа, то нужно использовать параметр LIMIT.
В этом параметре задается два значения:
LIMIT start,length
start - указывает, с какой позиции нужно выдавать найденные записи
length - кол-во записей

Например, нам нужно выбрать из базы данных гостевой книги записи начиная с 20 по 45 (т.е. чтоб вывести 25 записей):

$sql="select * from db_guest limit 20,25";
$result=mysql_query($sql);

Отсюда

mfl
На сайте с 16.10.2006
Offline
134
mfl
#3

БД MySQL.

limit?

Немного не поняли,

Вот шаблон запроса:

SELECT STRAIGHT_JOIN SQL_CACHE SQL_CALC_FOUND_ROWS 

tabl1.id, tabl1.text, tabl2.id, tabl2.text
FROM `tabl1`, `tabl2`
WHERE ( MATCH(tabl1.text) AGAINST (\''.mysql_escape_string($text).'\') )
AND (them2.id = tabl1.tabl2)
LIMIT '.(($s-1)*$ks).' , '.$ks

Суть заключается в ограниченни максимального числа ВСЕХ строк в результате поиска.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#4

mfl, может искать строки не извлекая поля типа text, а эти поля потом считывать из базы? Похоже, что здесь строится огромадная помежуточная таблица, которая из-за факта наличия полей типа text сбрасывается полностью на диск. И только потом из неё извлекаются нужные по LIMIT данные. Отсюда и тормоза. Один большой запрос и куча маленьких могут быть намного быстрее, чем этот.

mfl
На сайте с 16.10.2006
Offline
134
mfl
#5
mfl, может искать строки не извлекая поля типа text, а эти поля потом считывать из базы?

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

Так же это наблюдается при испольховании COUNT вместо SQL_CALC_FOUND_ROWS

А выборка нужных данных производится быстро.

Вот средние результаты:

SELECT STRAIGHT_JOIN SQL_CACHE SQL_CALC_FOUND_ROWS tabl1.id, tabl1.text, tabl2.id, tabl2.text FROM ...

время выполнения (4,7-5) сек

SELECT SQL_CACHE COUNT(id) FROM `tabl1` WHERE ...

время выполнения (~4,5) сек

SELECT STRAIGHT_JOIN SQL_CACHE tabl1.id, tabl1.text, tabl2.id, tabl2.text FROM ...

время выполнения (~0,17) сек

Данные указаны при поиске в таблице из 389508 строк

В результате поиска всего строк удовлетворяющих условию 29297

Из них выводится 25 строк

При поисковых фразах в результете которых удовлетворяет условию до 1000 строк, время выполнения до 0,2 сек, что меня вполне устраивает.

Вот я и думаю, как бы ограничить результат.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий