У меня есть таблица с ~ 2.8 миллионами строк, 3 столбца. Каждая строка представляет собой маркетинговый штрих от компании и имеет «customer_id», «marketing_type» и «week_num». Существует индекс «customer_id» и еще один индекс «marketing_type»Ускорение самоподготовки в MYSQL
Пример данных:
72, catalog, 7
72, email, 3
99, catalog, 13
82, catalog, 7
Мне нужен список всех customer_id, у которых было электронное письмо, но не было каталога. (Есть и другие виды маркетинга, и есть customer_id о том, что не получили ничего)
Сначала попробуйте:
SELECT DISTINCT cust_id
FROM marketing_campaign
WHERE marketing_type = 'email'
AND cust_id NOT IN (
SELECT cust_id
FROM marketing_campagin
WHERE marketing_type = 'catalog'
)
;
этот запрос занимает 30+ минут, чтобы запустить
второй попытки :
SELECT m1.cust_id
FROM marketing_campaign m1
LEFT OUTER JOIN marketing_campaign m2
ON m1.cust_id = m2.cust_id
AND m2.MARKETING_TYPE = 'catalog'
WHERE m1.MARKETING_TYPE = 'email'
AND m2.cust_id IS NULL
;
Этот запрос выполняется в 3,8 секунды с, но выбирается в течение 30 минут.
Третий Try:
SELECT distinct cust_id
FROM marketing_campaign a
WHERE MARKETING_TYPE = 'email'
AND NOT EXISTS (
SELECT 'X'
FROM marketing_campaign b
WHERE a.cust_id = b.cust_id
AND MARKETING_TYPE = 'catalog'
)
ORDER BY cust_id
;
Этот запрос также выполняется в < 5 секунд, а затем получает в течение 20+ минут.
Может ли кто-нибудь предложить альтернативу?
Я полагаю, что у вас установлены индексы правильно ... и ваш кэш/буферный пул запросов установлен в соответствующий размер для обработки этого набора данных? – Hackerman