2014-09-08 5 views
0

У меня этот запрос MySQL, но он очень медленный.Как оптимизировать этот запрос MySQL

SELECT 
     d.idcartera, 
     concat(d.cedula, ':', planilla.fuerza, ':', planilla.cuotas, ':', d.libranza, ':', planilla.promotor) AS ClienteCedula, 
     concat(d.nombres, ':', planilla.fuerza, ':', planilla.cuotas, ':', d.libranza, ':', planilla.promotor) AS ClienteNombre, 
     d.valor, 
     d.tipo, 
     concat(d.ano, '/', d.mes, '-', left(d.tipo,3)) AS anoMes, 
     planilla.fuerza, 
     planilla.cuotas, 
     planilla.promotor 
     FROM cartera AS d 
     INNER JOIN cartera AS x ON d.cedula = x.cedula 
     INNER JOIN cartera AS y ON d.cedula = y.cedula 
     INNER JOIN planilla ON d.libranza = planilla.libranza 
     WHERE (d.tipo not like '%RI-%') AND (left(x.tipo, 3) like 'RC-') AND (left(y.tipo, 3) like 'RCN') 
     GROUP BY d.idcartera, d.cedula 

К сожалению «у» таблицы для фильтрации некоторых данные

+0

Как выглядят ваши клавиши? Имеются ли d.cedula, x.cedula, y.cedula, индексированные? Как насчет полей d.tipo и x.tipo, вы рассчитали индексы в этих полях? –

+0

, возможно, указывая, что означает медленное и что бы вы хотели достичь, помогли бы возможным ответчикам. Кроме того, если вы уже пробовали некоторые оптимизации, это помогло бы опубликовать ваши испытания. –

+0

Ничего не видно из самого запроса ... предложения типа «как» в предложении where, вероятно, вызывают небольшую головную боль. один быстрый reqrite: (left (x.tipo, 3), как «RC-») может быть (left (x.tipo, 3) = 'RC-') (нет необходимости в подобном). Кроме того, вам нужно знать структуру и индексирование таблиц, чтобы помочь оптимизировать это дальше. – Twelfth

ответ

0

Для кулачных частей запроса (запроса и группировки cartera AS г) вы должны рассмотреть следующий индекс:

CREATE index i1a ON cartera(cedula, idcartera, tipo, liberanza); 
CREATE index i1b ON cartera(idcartera, cedula, tipo, liberanza); 

или

CREATE index i1c ON cartera(tipo, idcartera, cedula, liberanza); 

(в зависимости от СУБД, если «левый/как» -Операция может быть применен к рубрикации колонка tipo.

для присоединяется к х и у, вы должны добавить следующий индекс (если он еще не PK):

CREATE index i2 ON cantera(cedula) (if you will use i1b or i1c) 

Для объединения на planilla, добавить CREATE INDEX i3 ON planilla (liberanza) (если уже не PK)

0

Вот ваш запрос:

SELECT d.idcartera, 
     concat(d.cedula, ':', planilla.fuerza, ':', planilla.cuotas, ':', d.libranza, ':', planilla.promotor) AS ClienteCedula, 
     concat(d.nombres, ':', planilla.fuerza, ':', planilla.cuotas, ':', d.libranza, ':', planilla.promotor) AS ClienteNombre, 
     d.valor, d.tipo, concat(d.ano, '/', d.mes, '-', left(d.tipo,3)) AS anoMes, 
     planilla.fuerza, planilla.cuotas, planilla.promotor 
FROM cartera d INNER JOIN 
    cartera x 
    ON d.cedula = x.cedula INNER JOIN 
    cartera y 
    ON d.cedula = y.cedula INNER JOIN 
    planilla 
    ON d.libranza = planilla.libranza 
WHERE (d.tipo not like '%RI-%') AND (left(x.tipo, 3) like 'RC-') 
GROUP BY d.idcartera, d.cedula; 

Вы делаете самостоятельно присоединиться три раза, а не ссылки на y таблицы, и делать агрегации без агрегационных функций.

Первое упрощение заключается в том, чтобы удалить y все вместе. Я думаю, что для фильтрации требуется соединение x, поэтому я заменю его на exists. И, я предполагаю, что окончательный запрос не требует агрегации с этими упрощениями. Так, возможно, это делает то, что вы хотите:

SELECT d.idcartera, 
     concat(d.cedula, ':', p.fuerza, ':', p.cuotas, ':', d.libranza, ':', p.promotor) AS ClienteCedula, 
     concat(d.nombres, ':', p.fuerza, ':', p.cuotas, ':', d.libranza, ':', p.promotor) AS ClienteNombre, 
     d.valor, d.tipo, concat(d.ano, '/', d.mes, '-', left(d.tipo,3)) AS anoMes, 
     p.fuerza, p.cuotas, p.promotor 
FROM cartera d INNER JOIN 
    planilla p 
    ON d.libranza = p.libranza 
WHERE d.tipo not like '%RI-%' AND 
     exists (select 1 
       from cartera x 
       where d.cedula = x.cedula and 
        x.tipo like 'RC-%' 
      ); 

Вы можете по-прежнему включают в себя select distinct, если это производит много дубликатов.

Я предполагаю, что у вас есть указатели на ключ join (в частности, planilla(libranza)). Вам также нужен индекс на cartera(cedula, tipo). К сожалению, выражение d.tipo not like '%RI-%' не может использовать индекс из-за исходного шаблона. Если вам нужна производительность для этого, вы можете рассмотреть полнотекстовый индекс в поле.

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