Чрезвычайно медленная загрузка страницы поиска (MySQL и PHP) - PullRequest
3 голосов
/ 29 июня 2011

Я сделал простое окно поиска на странице, где пользователь может вводить ключевые слова, чтобы искать фотографии определенных предметов, используя PHP. Я использую базу данных MySQL. Я обрезаю результат и показываю только 10, чтобы ускорить загрузку, но определенный набор ключевых слов заставляет браузер зависать как в IE, так и в Firefox. Когда это происходит в IE, я вижу контуры фотографий (только силуэт) за пределами 10 результатов со знаком «X» в верхнем правом углу, аналогично тому, когда вы загружаете фотографию, и фотография не существует на веб-странице , хотя я написал код, чтобы показать только 10 результатов. База данных насчитывает более 10000 записей, и я думаю, что, возможно, она пытается отобразить весь набор фотографий в базе данных. Вот код, который я использую.

Я использую функцию ниже, чтобы создать запрос. $ keyword - это массив ключевых слов, которые набрал пользователь.

function create_multiword_query($keywords) {
// Creates multi-word text search query
$q = 'SELECT * FROM catalog WHERE ';
$num  = 0;
foreach($keywords as $val) {    // Multi-word search
    $num++;
    if ($num == 1) {
        $q = $q . "name LIKE  '%$val%'"; }
    else {
        $q = $q . " AND name LIKE  '%$val%'";}
} 
$q = $q . ' ORDER BY name';
return $q;
//$q = "SELECT * FROM catalog WHERE name LIKE \"%$trimmed%\" ORDER BY name";
}

И отобразить результат. MAX_DISPLAY_NUM - 10.

$num = 0;
while (($row = mysqli_fetch_assoc($r)) && ($num  < MAX_DISPLAY_NUM)) {  // add max search result!
    $num++;
    print_images($row['img_url'], '/_', '.jpg');    // just prints photos               
}

Я очень новичок в PHP, но я не могу найти ничего плохого в своем коде. Может быть, способ, которым я написал эти алгоритмы, не совсем подходит для PHP или MySQL? Ребята, можете ли вы помочь мне с этим? Я могу разместить больше кода по мере необходимости. ТИА !!

Ответы [ 5 ]

5 голосов
/ 29 июня 2011

Не ограничивайте результаты поиска в PHP, ограничивайте их в запросе SQL ключевым словом LIMIT.

Как в:

select * form yourtable where ... order by ... limit 10;

Кстати, эти LIKE '%something%' могут быть дорогими. Может быть, вам стоит взглянуть на Полнотекстовое индексирование и поиск .

Если вы хотите показать More... ссылку или что-то в этом роде, одним из способов будет limit ваш запрос до 11 и показывать только первые десять.

3 голосов
/ 29 июня 2011

Помимо LIMIT в вашем запросе, я бы проверил mysql полнотекстовый поиск (если ваши таблицы имеют формат MyISAM).

2 голосов
/ 29 июня 2011

Почему бы не использовать MySQL для ограничения числа возвращаемых результатов поиска?

http://dev.mysql.com/doc/refman/5.0/en/select.html

1 голос
/ 29 июня 2011

добавить LIMIT к вашему запросу.

вы извлекаете все строки из БД (много байтов, перемещающихся из БД на сервер), а затем фильтруете первые 10 строк.1005 *

$q = $q . ' ORDER BY name LIMIT 10';
0 голосов
/ 29 июня 2011

LIKE является медленным также в соответствии с Flickr (слайды 24-26). Сначала вы должны попробовать использовать FULL TEXT indexes . Если ваш сайт все еще кажется медленным, есть и другие действительно быстрые / популярные альтернативы:

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

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