He estado usando SQL durante años, pero rara vez nada más que simples inserciones y selecciones, etc. ... así que no soy experto en SQL. Me pregunto si podría obtener ayuda para optimizar una declaración SQL más compleja que estoy ejecutando en SQLite, desde PHP hasta PDO.SQLite optimización de inserción de selección múltiple
La declaración parece funcionar correctamente, parece que tarda más de lo que esperaba (o tal vez estoy esperando demasiado).
Este es el SQL:
INSERT OR IGNORE INTO MailQueue(SubscriberID, TemplateID)
SELECT Subscribers.ID, '1' AS TemplateID
FROM Subscribers
INNER JOIN SubscriberGroups ON Subscribers.ID=SubscriberGroups.SubscriberID
WHERE SubscriberGroups.GroupID IN ('1', '2', '3')
AND Subscribers.ID NOT IN
(
SELECT Subscribers.ID FROM Subscribers
INNER JOIN SubscriberGroups ON Subscribers.ID=SubscriberGroups.SubscriberID
WHERE SubscriberGroups.GroupID IN ('4', '5', '6')
);
Lo que tengo es una lista de suscriptores, en uno o más grupos. Quiero agregar suscriptores a una cola de correo, seleccionando aquellos que pertenecen a uno o más grupos (1,2,3) pero excluyo aquellos que también están en otro grupo de grupos (4,5,6).
En primer lugar, ¿el SQL anterior es típico de cómo hacer esto?
En segundo lugar, ¿qué índices debo tener para que esto funcione de la manera más eficiente posible?
Actualmente, se tardan unos 30 segundos en atravesar unos 5000 registros de suscriptores (y un puñado de grupos) en una especificación AVAG LAMP.
Al final del día, el rendimiento no es tan crítico, pero me gustaría entender esto mejor para que cualquier idea sea muy apreciada.
Brad
Gracias Matt, eso es genial. Su primera solución la obtuvo de 30 segundos a 5 o 6, lo cual es suficiente. No probé la segunda opción porque realmente no la entiendo, pero la tendré en cuenta si se convierte en un problema. Gracias de nuevo –