Оптимизация моей случайной выборки строк - PullRequest
0 голосов
/ 22 декабря 2011

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

У меня есть информация о баннере в моей базе данных в таблице, называемой «баннеры», и я хочу отобразить случайный баннер по отношению к позиции на странице и добавить +1 к view_count для этого баннера. Мой метод работает, но для загруженного сайта, где это происходит при каждой загрузке страницы, это можно улучшить для скорости? Спасибо

/* Get banners for position 1 then choose a random one to display  */
$banners = mysql_query("SELECT id,title,banner_url,destination FROM ".TBL_BANNERS." WHERE position = '1' AND status = '1'");
$banner_count = mysql_num_rows($banners) - 1;
$rand_offset = mt_rand(0,$banner_count);
$result = mysql_query("SELECT id,title,banner_url,destination FROM ".TBL_BANNERS." LIMIT $rand_offset, 1 "); 

$banner_id = mysql_result($result,0,"id");
$banner_title = mysql_result($result,0,"title");
$banner_url = mysql_result($result,0,"banner_url");
$banner_dest = mysql_result($result,0,"destination");

/* Add view to this banner */
$database->addViewToBanner($banner_id);

Последняя функция использует запрос:

    "UPDATE banners SET view_count = view_count+1 WHERE id = '$banner_id'"

Я также должен сказать, что, вероятно, не будет более 100 записей в таблице «баннеров» одновременно, но в идентификаторе будут дыры. Идентификаторы могут подняться до 200, но только половина из них все еще будет существовать.

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Создайте случайное число в php и сверните его таким образом в PK

SQL будет

SELECT id,title,banner_url,destination 
FROM TBL_BANNERS 
WHERE id = $rand_offset

Если вы пропустите, запустите его снова. Это дает очень эффективный поиск в одной строке, что будет лучше, чем при использовании обработки предела / смещения

1 голос
/ 22 декабря 2011

Идеальный способ сделать это, как вы можете читать во многих местах в Интернете, например, Блог Антона Титова должен выполнить 2 запроса:

SELECT COUNT(*) AS banners FROM quotes

Затем сгенерируйте случайное число на вашем языке программирования (т. Е. PHP использует mt_rand ). и скормить его в этот запрос:

SELECT * FROM banners LIMIT $generated_number, 1

ПРИМЕЧАНИЕ: это не рекомендуется использовать, если в вашей таблице только небольшое количество строк. Обычно я все еще использую ORDER BY RAND () до тех пор, пока не узнаю, что в таблице будет более 100 строк.

0 голосов
/ 22 декабря 2011

Вместо первого SELECT используйте это:

$banners_count_result = mysql_query("SELECT COUNT(*) AS num_banners FROM ".TBL_BANNERS." WHERE position = '1' AND status = '1'");
$banner_count = mysql_result($banners_count_result, 0, "num_banners");

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

...