J'utilise SQL depuis des années mais rarement plus rien de plus simple insère et sélectionne etc ... donc je ne suis pas un expert SQL. Je me demande si je pourrais obtenir de l'aide pour optimiser une instruction SQL plus complexe que j'exécute sur SQLite, de PHP à PDO.SQLite optimisant l'insertion multi-sélection
La déclaration semble fonctionner correctement, semble juste prendre plus de temps que je me serais attendu (ou peut-être que je m'attends à trop).
C'est le 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 une liste d'abonnés, dans un ou plusieurs groupes. Je veux ajouter des abonnés à une file d'attente de courrier, en sélectionnant ceux qui appartiennent à un ou plusieurs groupes (1,2,3) mais excluez ceux qui sont également dans un autre groupe de groupes (4,5,6).
Premièrement, le SQL ci-dessus est-il typique de la façon de faire cela? Deuxièmement, quels indices dois-je avoir pour que ce travail fonctionne le plus efficacement possible?
Actuellement, il faut environ 30 secondes pour parcourir environ 5000 enregistrements d'abonnés (et une poignée de groupes) sur une LAMP moyenne. À la fin de la journée, les performances ne sont pas si importantes, mais je voudrais mieux comprendre ce genre de choses afin que toute idée soit grandement appréciée.
Brad
Merci Matt, c'est génial. Votre première solution l'a fait passer de 30 secondes à environ 5 ou 6, ce qui est assez bon. Je n'ai pas essayé la deuxième option parce que je ne la comprends pas vraiment, mais je la garderai à l'esprit si cela devient un problème. Merci encore –