запрос mysql занимает 400 секунд для выполнения

Вот запрос, который загружается 400 секунд. Я пробовал в MySQL напрямую. Если я попробую подзапросы по отдельности, все они будут выполнены менее чем за 0,01 секунды. запрос после объединения всех выполняется за 40 секунд. запрос перед объединением всех выполняется за 1 секунду.

Таблица продаж и таблица продаж содержат около 12 тысяч записей каждая. Цель этого запроса - когда поставщик = партнер в таблице продаж, тогда мне нужно добавить строки из таблицы продаж, идентификатор которых соответствует критериям поиска в таблице продаж.

 (
 SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests 
    FROM sales ss 
    WHERE 1=1 AND 
        ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
  ) 

 UNION ALL 

 ( 
 SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests 
 FROM salesaff sf 
 WHERE sf.vendor=sf.affiliate AND 
 sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1 
               AND ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
               GROUP BY ss.orderid ) 
 ) 

 ORDER BY salests DESC

person user3144629    schedule 28.02.2014    source источник
comment
Что с бизнесом «Где 1=1»? в этом нет необходимости. Кроме того, пожалуйста, отформатируйте свой SQL, чтобы мы могли его прочитать.   -  person Rick S    schedule 28.02.2014
comment
Попробуйте без предложения order by и посмотрите, как пойдет.   -  person Koshera    schedule 28.02.2014
comment
1 = 1 - написать динамический запрос, чтобы я мог добавить столбец AND = условие из скрипта. Я удалил 1 = 1 и не пытался изменить производительность.   -  person user3144629    schedule 28.02.2014
comment
сам второй запрос занимает 40 сек, без порядка на 4 сек улучшается.   -  person user3144629    schedule 28.02.2014
comment
Попробуйте использовать EXPLAIN, чтобы увидеть узкое место. slideshare.net/phpcodemonkey/mysql-explain-explained   -  person Rick S    schedule 28.02.2014
comment
2 составных индекса sales(vendor,orderid),sales(affiliate,orderid) и один на salesaff(vendor,affiliate,orderid) могут улучшить ситуацию.   -  person Mihai    schedule 28.02.2014


Ответы (2)


Попробуйте запустить это:

EXPLAIN ( SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests FROM sales ss WHERE 1=1 AND ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') )

UNION ALL

( SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests FROM salesaff sf WHERE sf.vendor=sf.affiliate AND

sf.orderid IN ( SELECT ss.orderid from sales ss WHERE 1=1 AND ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') GROUP BY ss.orderid ) )

ORDER BY salests DESC

проверьте, не имеет ли «ключевой» столбец значение null, в противном случае добавьте индексы к указанным столбцам.

Если это не помогает, проверьте этот ответ: https://dba.stackexchange.com/questions/7806/copying-to-tmp-table-extremely-slow

person Bobby    schedule 28.02.2014
comment
Хм, кажется, у вас нет индексов. Попробуйте следующее: ALTER TABLE sales ADD KEY key_vendor(vendor), ADD KEY key_salests(salests), ADD KEY key_affilate(affiliate); ALTER TABLE salesaff ADD KEY key_vendor(vendor), ADD KEY key_salests(salests), ADD KEY key_affilate(affiliate); затем перезапустите запрос. - person Bobby; 28.02.2014
comment
Благодарю. ключ не отображается в двух строках, а ключ имеет значение null, когда тип выбора - объединение. - person user3144629; 28.02.2014
comment
добавил эти показатели, но без улучшения. - person user3144629; 01.03.2014

Я думаю, что он пытается заказать во время выполнения запроса. Это может помочь:

SELECT * FROM (
(
 SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests 
    FROM sales ss 
    WHERE 1=1 AND 
        ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
  ) 

 UNION ALL 

 ( 
 SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests 
 FROM salesaff sf 
 WHERE sf.vendor=sf.affiliate AND 
 sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1 
               AND ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade') 
               GROUP BY ss.orderid ) 
 ) 
)
ORDER BY salests DESC
person Koshera    schedule 28.02.2014
comment
Ошибка: каждая производная таблица должна иметь собственный псевдоним. - person user3144629; 28.02.2014
comment
Попробуйте присвоить псевдонимы двум запросам, входящим в объединение: select * from ( (query 1) a union all (query 2) b) order by... - person Koshera; 28.02.2014