Оптимизировать SQL запрос с выбором рандомных строк - MySQL

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Уже всю голову сломал. Интернет магазин. Штук 100 категорий, в каждой категории есть товары. Требуется вывести в рекламный баннер десять рандомных товаров из БД. ВАЖНО: id товаров не идут по порядку в БД, то есть выбрать нужно только определенные. Вот как делаю я:
Листинг программы
  1. $time1 = microtime(true)*1 ; // засекаю время начала скрипта
  2. $query02 = 'SELECT `sp_items`.`id_items`
  3. FROM `sp_items`, `sp_purchases` , `sp_cats`
  4. WHERE `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
  5. AND `sp_purchases`.`state`=0
  6. AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
  7. AND `sp_cats`.`deletecat` = 0
  8. And `sp_items`.`price` > 0
  9. AND `sp_items`.`hidden` = 0
  10. AND `sp_items`.`invisible` = 0
  11. And `sp_items`.`image_urls` <> "a:0:{}"';
  12. $res02 = $db->sql_query($query02); // делаю запрос к БД
  13. $num2 = $res02->num_rows; // число строк
  14. echo $num2.'<br>'; // этот код просто для информации. ИТОГ 186000 строк
  15. $time2 = microtime(true)*1 ;
  16. $time=($time2-$time1);
  17. echo $time.'<br>'; // время исполнения до 2.5-3 секунд
  18. while($row = $db->sql_fetchrow($res02)) // раскладываю получившийся результат на строки
  19. {
  20. $ava_ids02[] = $row['id_items']; // получаю массив с результатами
  21. }
  22. $massiv=array(); // объявляю новый массив в котором будут выбранные id для баннера
  23. while (count($massiv) < 10) {
  24. $rnd=rand(0, ($num2 - 1));
  25. $massiv[] = $ava_ids02[$rnd]; // получаю массив из 10 рандомных id товаров
  26. }
  27. //далее уже делаю конкретный запрос с данными товаров по их id, находящимся в созданном массиве $massiv
  28. $query = "SELECT id_items, purchase_id, catalog_id, name, price, image_urls FROM sp_items WHERE id_items IN (".implode(',',$massiv).") ORDER BY id_items desc LIMIT ".count($massiv);
Помогите оптимизировать этот код. если на каждую страницу по 2 сек и добавить еще сотни пользователей на сайт. Нагрузка на сервере возрастает с 6% до 50%. Хостер матерится. Очень прошу помощи

Решение задачи: «Оптимизировать SQL запрос с выбором рандомных строк»

textual
Листинг программы
  1.     $query02 = 'EXPLAIN SELECT `sp_items`.`id_items`
  2.            FROM `sp_items`, `sp_purchases` , `sp_cats`
  3.            WHERE  `sp_items`.`purchase_id` =`sp_purchases`.`id_purchases`
  4.            AND `sp_purchases`.`state`=0
  5.            AND `sp_items`.`catalog_id`=`sp_cats`.`id_cats`
  6.            AND `sp_cats`.`deletecat` = 0
  7.            And `sp_items`.`price` > 0
  8.            AND `sp_items`.`hidden` = 0
  9.            AND `sp_items`.`invisible` = 0
  10.            And `sp_items`.`image_urls` <> "a:0:{}"';
  11.  
  12.      
  13.   $res02 = $db->sql_query($query02);  
  14.   $num2 = $res02->num_rows; // число строк
  15.   echo $num2.'<br>';
  16.  
  17.   $time2 = microtime(TRUE)*1 ;
  18.   $time=($time2-$time1);
  19.   echo $time.'<br>';
  20.  
  21.          while($row = $db->sql_fetchrow($res02))
  22.         {
  23.              $ava_ids02[] = $row['id_items'];
  24.         }
  25.         $sss=COUNT($ava_ids02);
  26.          while (COUNT($massiv) < 10) {
  27.         $rnd=rand(0, ($sss - 1));
  28.         $massiv[] = $ava_ids02[$rnd];
  29.         }
  30. print_r($massiv);

Объяснение кода листинга программы

  1. Создается переменная $query02, которая содержит SQL-запрос.
  2. SQL-запрос выбирает случайные строки из таблицы sp_items, которые удовлетворяют определенным условиям.
  3. Выполняется SQL-запрос с помощью метода sql_query объекта $db.
  4. Результат запроса сохраняется в переменной $res02.
  5. Определяется количество строк в результате запроса с помощью метода num_rows объекта $res02.
  6. Вычисляется время выполнения запроса с помощью функции microtime.
  7. В цикле while проходят все строки результата запроса и сохраняют значения столбца id_items в массив $ava_ids02.
  8. Определяется количество элементов в массиве $ava_ids02.
  9. В цикле while случайным образом выбираются элементы из массива $ava_ids02 и добавляются в другой массив $massiv.
  10. Массив $massiv выводится с помощью функции print_r.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы