Q:

Optimizar consulta mysql Sorting result

Como dice el titulo, la consulta que tengo es esta:
SELECT id, first_date_order, last_date_order, 
                (SELECT o.created_at 
                 FROM orders o 
                 WHERE o.customer_id = c.id
                 ORDER BY o.created_at DESC
                 LIMIT 1) 
                 as last_date_order_real,
                 (SELECT o.created_at 
                 FROM orders o 
                 WHERE o.customer_id = c.id
                 ORDER BY o.created_at ASC
                 LIMIT 1) 
                 as first_date_order_real
FROM customer c
WHERE orders > 0

Basicamente lo que hace es, coger todos los customers que tienen algun pedido, la fecha de su primer pedido y la fecha de su ultimo pedido, y luego calcular a partir de la relacion order <-> customer, la fecha real tanto del primer pedido como del ultimo. 
Tarda algo mas de 4 minutos en ejecutarse, la mayor parte del tiempo la pasa en el estado Sorting result, imagino que el problema de la consulta es que para cada customer (1M approx), tiene que hacer 2 consultas, y para cada una de esas consultas tiene que ordenar los registros de manera ascendente y descendente. 

A:

No tienes para qué hacer una subconsulta para cada uno de esos datos que quieres.  Basta con hacer un LEFT JOIN, y usar MAX y MIN:
SELECT  c.id, 
        c.first_date_order, 
        c.last_date_order, 
        MAX(o.created_at) last_date_order_real,
        MIN(o.created_at) first_date_order_real
FROM customer c
LEFT JOIN orders o
    ON c.id = o.customer_id
WHERE c.orders > 0
GROUP BY c.id, 
         c.first_date_order, 
         c.last_date_order;

