J'utilise SQL depuis des années, mais rarement plus que de simples insertions et sélections, etc... Je ne suis donc pas un expert en SQL. Je me demandais si je pouvais obtenir de l'aide pour optimiser une instruction SQL plus complexe que j'exécute sur SQLite, à partir de PHP via PDO.
La déclaration semble fonctionner correctement, mais prend plus de temps que prévu (ou peut-être ai-je trop d'attentes).
Il s'agit du 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')
);
Ce que j'ai, c'est une liste d'abonnés, dans un ou plusieurs groupes. Je veux ajouter des abonnés à une file d'attente, en sélectionnant ceux qui appartiennent à un ou plusieurs groupes (1,2,3), mais en excluant ceux qui font également partie d'un autre ensemble de groupes (4,5,6).
Tout d'abord, le code SQL ci-dessus est-il représentatif de la manière de procéder ?
Deuxièmement, quels sont les indicateurs dont je dois disposer pour que ce travail soit le plus efficace possible ?
Actuellement, il faut environ 30 secondes pour parcourir environ 5000 enregistrements d'abonnés (et une poignée de groupes) sur un LAMP de taille moyenne.
En fin de compte, la performance n'est pas si critique, mais j'aimerais mieux comprendre ce genre de choses.
Brad