Używam SQL od lat, ale rzadko coś więcej niż proste wkładki i wybiera etc ... więc nie jestem ekspertem SQL. Zastanawiam się, czy mogę uzyskać pomoc w optymalizacji bardziej złożonych instrukcji SQL, które wykonuję na SQLite, od PHP przez PDO.Optymalizowanie SQLite wkładka wielokrotnego wyboru
Wydaje się, że to polecenie działa poprawnie, wydaje się, że trwa dłużej, niż mogłem się spodziewać (a może po prostu oczekuję zbyt wiele).
Jest to 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')
);
Co mam jest lista abonentów, w jednej lub kilku grupach. Chcę dodać subskrybentów do kolejki pocztowej, wybierając te, które należą do jednej lub więcej grup (1,2,3), ale wykluczają te, które są również w innym zestawie grup (4,5,6).
Po pierwsze, czy powyższy SQL jest typowy jak to zrobić?
Po drugie, jakie wskazówki powinienem podać, aby działało to tak wydajnie, jak to możliwe?
Obecnie trwa to około 30 sekund, aby uzyskać około 5000 rekordów abonenta (i garść grup) na średniej LAMP.
Pod koniec dnia wydajność nie jest aż tak krytyczna, ale chciałbym to lepiej zrozumieć, aby każdy wgląd był bardzo doceniany.
Brad
Dzięki Matt, świetnie. Twoje pierwsze rozwiązanie otrzymało od 30 sekund do około 5 lub 6, co jest wystarczająco dobre. Nie próbowałem drugiej opcji, ponieważ tak naprawdę jej nie rozumiem, ale będę o tym pamiętał, jeśli stanie się problemem. Jeszcze raz dziękuję –