Ok, aquí hay una consulta que estoy ejecutando ahora en una tabla que tiene 45,000 registros y tiene 65MB de tamaño ... y está a punto de hacerse más y más grande (entonces tengo que pensar del futuro rendimiento, así aquí):Optimización de una consulta SELECT incrustada en mySQL
SELECT count(payment_id) as signup_count, sum(amount) as signup_amount
FROM payments p
WHERE tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND completed > 0
AND tm_completed IS NOT NULL
AND member_id NOT IN (SELECT p2.member_id FROM payments p2 WHERE p2.completed=1 AND p2.tm_completed < '2009-05-01' AND p2.tm_completed IS NOT NULL GROUP BY p2.member_id)
Y a medida que podría o no podría imaginar - que ahoga el servidor MySQL a un punto muerto ...
lo que hace es - simplemente tira de la serie de los nuevos usuarios que se registraron, tienen al menos un pago "completado", tm_completed no está vacío (ya que solo se llena para los pagos completados), y (el Select incrustado) ese miembro nunca ha tenido un "com se ha completado el pago antes, lo que significa que es un miembro nuevo (solo porque el sistema se vuelve a facturar y otras cosas, y esta es la única forma de diferenciar entre un miembro existente que acaba de ser reembolsado y un nuevo miembro que se facturó por primera vez) .
Ahora, ¿hay alguna manera posible de optimizar esta consulta para usar menos recursos o algo así, y dejar de tomar mis recursos de mysql de rodillas ...?
¿Me falta alguna información para aclarar esto más? Avisadme ...
EDIT:
Estos son los índices que ya en esa tabla:
PRIMARIA PRIMARIA 46757 payment_id
ÍNDICE member_id 23378 member_id
ÍNDICE payer_id 11689 payer_id
cupón_id INDICE 1 coupon_id
ÍNDICE tm_added 46757 tm_added, product_id
tm_completed ÍNDICE 46757 tm_completed, product_id
¿tiene índices en los campos donde se utilizan argumentos de búsqueda – James