Я пытаюсь получить статистику пользователя из mysql. Что-то вроде:Как оптимизировать несколько подзапросов?
- 10% пользователей купили Пепси
- 20% являются женщины
- 40% из них на США
Первый шаг получить список всех пользователей купили что-то от пепси производитель.
Этот запрос работает менее чем за 1 секунду и возвращает список идентификаторов пользователей.
SELECT DISTINCT idUser FROM checkout_item INNER JOIN (
SELECT id FROM product WHERE manufacturer = "pepsi"
) AS chkItem ON chkItem.id = checkout_item.idProduct
Теперь я пользуюсь этим списком, чтобы получить информацию. Просто добавьте свой запрос выше:
SELECT
name, gender
FROM users INNER JOIN(
SELECT DISTINCT idUser FROM checkout_item INNER JOIN ( //
SELECT id FROM product WHERE manufacturer = "pepsi" // same query above
) AS chkItem ON chkItem.id = checkout_item.idProduct //
) AS usr ON usr.idUser = users.id
Этот запрос работает, но требуется 23 секунды. Есть ли способ оптимизировать это?
Возможно использование WHERE, JOINs или изменение конфигураций RAM mysql?
Включены ли ваши таблицы? – vaso123
спасибо @lolka_bolka, я создал индексы в полях NAME и GENDER, и теперь это занимает 2 секунды. – anderlaini
Мне трудно поверить, что индексы по имени и полу помогут, поскольку они не включены ни в один из параметров фильтрации. Является ли запрос, который отличается от запроса, который вы опубликовали? –