powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса с ORDER BY RAND()
15 сообщений из 15, страница 1 из 1
Оптимизация запроса с ORDER BY RAND()
    #39932460
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Помогите пожалуйста оптимизировать запрос. Я так понимаю что надо избавиться от ORDER BY RAND() с помощью определения максимального id... Но у меня что-то не выходит
Код: sql
1.
2.
3.
4.
5.
6.
$query = $this->db->query("SELECT p2c.product_id FROM `" . DB_PREFIX . "product_to_category` p2c 
LEFT JOIN `" . DB_PREFIX . "product` p ON (p2c.product_id = p.product_id) 
LEFT JOIN `" . DB_PREFIX . "product_to_store` p2s ON (p.product_id = p2s.product_id) 
WHERE p2c.category_id IN (" . $category_list . ") AND p2c.product_id != '" . (int)$product_id . "' AND p.status = '1' AND p.quantity > 0 AND p.date_available <= NOW() AND p2s.store_id = '0' 
ORDER BY RAND() 
LIMIT 8);


Спасибо!
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932480
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_1985,

не много кто будет копатся в твоем коде который собирает запрос....


вытащи ТОЛЬКО запрос (уже собранный) и его давай сюда
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932481
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT 
  p2c.product_id 
FROM 
  * p2c 
  LEFT JOIN product p ON (p2c.product_id = p.product_id) 
  LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) 
WHERE 
  p2c.category_id IN (1, 2) 
  AND p2c.product_id != '22' 
  AND p.status = '1' 
  AND p.quantity > 0 
  AND p.date_available <= NOW() 
  AND p2s.store_id = '0' 
ORDER BY 
  RAND() 
LIMIT 
  8
)
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932486
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vde69,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
LEFT JOIN `oc_product` p ON (p2c.product_id = p.product_id) 
LEFT JOIN `oc_product_to_store` p2s ON (p.product_id = p2s.product_id) 
WHERE 
p2c.category_id IN (42) 
AND p2c.product_id != '247' 
AND p.status = '1' 
AND p.quantity > 0 
AND p.date_available <= NOW() 
AND p2s.store_id = '0' 
ORDER BY 
RAND() 
LIMIT 8


Так?
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932519
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_1985,

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

начни с тынц
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932525
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_1985
Код: sql
1.
2.
3.
4.
AND p.status = '1' 
AND p.quantity > 0 
AND p.date_available <= NOW() 
AND p2s.store_id = '0' 

Этими строчками LEFT JOIN-ы превращаются в простые JOIN-ы. У запроса все в порядке с логикой?
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932569
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь не надо оптимизировать ORDER BY RAND()
здесь надо оптимизироватьвесь запрос.
если просто на словах - то по левой таблице делайте ORDER BY RAND() LIMIT 8
а уже потом джойните правую.
Логика не изменится с ЛефтДжойн
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932647
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vde69
на сколько я понимаю у тебя задача получить 8 случайных ссылок удовлетворяющих кучи условий?

Да
Сейчас немного уменьшил запрос, т.к. время date_available не используется и номер магазина тоже вырезаю, т.к. он один и добавляться не планируется.
Сейчас так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
LEFT JOIN `oc_product` p ON (p2c.product_id = p.product_id) 
WHERE 
p2c.category_id IN (42) 
AND p2c.product_id != '247' 
AND p.status = '1' 
AND p.quantity > 0 
ORDER BY 
RAND() 
LIMIT 8
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932651
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
max_1985
Код: sql
1.
2.
3.
4.
AND p.status = '1' 
AND p.quantity > 0 
AND p.date_available <= NOW() 
AND p2s.store_id = '0' 

Этими строчками LEFT JOIN-ы превращаются в простые JOIN-ы. У запроса все в порядке с логикой?


Задача выбрать 8 случайных товара из одной категории, товары должны быть включены и быть в наличии.
Информация по наличию храниться в таблице product, а список product_id с привязкой к category_id храниться в product_to_category
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932664
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
здесь не надо оптимизировать ORDER BY RAND()
здесь надо оптимизироватьвесь запрос.
если просто на словах - то по левой таблице делайте ORDER BY RAND() LIMIT 8
а уже потом джойните правую.
Логика не изменится с ЛефтДжойн


Не понял как это сделать... Сейчас так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
LEFT JOIN `oc_product` p ON (p2c.product_id = p.product_id) 
WHERE 
p2c.category_id IN (42) // выбираем товары у которых категория 42
AND p2c.product_id != '247' // исключаем из списка товар который открыт
AND p.status = '1'  // товар включен
AND p.quantity > 0 // товар в наличии
ORDER BY 
RAND() 
LIMIT 8



Задача выбрать 8 случайных товара из одной категории к которой принадлежит товар что открыт. Товары должны быть включены, быть в наличии и не равняться товару который открыт.
Информация по наличию храниться в таблице product, а список product_id с привязкой к category_id храниться в product_to_category
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932727
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_1985,
сначал оптимизировать это
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
WHERE 
p2c.category_id IN (42) // выбираем товары у которых категория 42
AND 
p2c.product_id != '247' // исключаем из списка товар который открыт


избавиться от IN
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932741
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
избавиться от IN

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
LEFT JOIN `oc_product` p ON (p2c.product_id = p.product_id) 
WHERE 
p2c.category_id = '42' // выбираем товары у которых категория 42
AND p2c.product_id != '247' // исключаем из списка товар который открыт
AND p.status = '1'  // товар включен
AND p.quantity > 0 // товар в наличии
ORDER BY 
RAND() 
LIMIT 8


Сейчас так )
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932780
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда оптимизируют - смотрят план запроса, использование индексов
лучше начинать с подзапросов, по частям.
перед селект поставь EXPLAIN
EXPLAIN SELECT...

вот это
ORDER BY RAND()
LIMIT 8
можно пока выкинуть
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932795
max_1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
когда оптимизируют - смотрят план запроса, использование индексов
лучше начинать с подзапросов, по частям.
перед селект поставь EXPLAIN
EXPLAIN SELECT...

вот это
ORDER BY RAND()
LIMIT 8
можно пока выкинуть


Что меня должно здесь насторожить? https://prnt.sc/r9xut8
...
Рейтинг: 0 / 0
Оптимизация запроса с ORDER BY RAND()
    #39932802
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_1985
Alex_Ustinov
здесь не надо оптимизировать ORDER BY RAND()
здесь надо оптимизироватьвесь запрос.
если просто на словах - то по левой таблице делайте ORDER BY RAND() LIMIT 8
а уже потом джойните правую.
Логика не изменится с ЛефтДжойн


Не понял как это сделать... Сейчас так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
p2c.product_id 
FROM `oc_product_to_category` p2c 
LEFT JOIN `oc_product` p ON (p2c.product_id = p.product_id) 
WHERE 
p2c.category_id IN (42) // выбираем товары у которых категория 42
AND p2c.product_id != '247' // исключаем из списка товар который открыт
AND p.status = '1'  // товар включен
AND p.quantity > 0 // товар в наличии
ORDER BY 
RAND() 
LIMIT 8




Задача выбрать 8 случайных товара из одной категории к которой принадлежит товар что открыт. Товары должны быть включены, быть в наличии и не равняться товару который открыт.
Информация по наличию храниться в таблице product, а список product_id с привязкой к category_id храниться в product_to_category
Тогда замените LEFT JOIN на JOIN, чтобы не морочить голову оптимизатору.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса с ORDER BY RAND()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]