Я читал о проблемах со скоростью, связанных с получением случайной строки через 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, но только половина из них все еще будет существовать.
ORDER BY rand() LIMIT 1
(может быть, с ним действительно что-то не так, я не шучу, я на самом деле спрашиваю)? - person DaveRandom   schedule 22.12.2011RAND()
— это вычисляемый столбец, поэтому его нельзя индексировать.ORDER BY
эффективен при поддержке индекса, а не иначе. - person Amadan   schedule 22.12.2011