2013-05-10 2 views
1


У меня есть таблица с ~ 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+ минут.


Может ли кто-нибудь предложить альтернативу?

+0

Я полагаю, что у вас установлены индексы правильно ... и ваш кэш/буферный пул запросов установлен в соответствующий размер для обработки этого набора данных? – Hackerman

ответ

2

Не пропускайте составные индексы:

ALTER TABLE marketing_campaign ADD KEY (marketing_type, cust_id); 

Затем с помощью запроса # 2.

Также убедитесь, что вы настроили свои буферы достаточно большими, чтобы индекс находился в ОЗУ.

Смежные вопросы