Potrzebuję wybrać niektóre dane z MySQL DB przy użyciu PHP. Można to zrobić w ramach jednej kwerendy MySQL, która trwa 5 minut, aby uruchomić na dobrym serwerze (wiele JOINów w tabelach z więcej niż 10 wierszami Mio).Powolne kwerendy MySQL - Cache danych w tablicy PHP?
Zastanawiam się, czy lepiej jest podzielić zapytanie w PHP i użyć trochę pętli niż MySQL. Czy byłoby lepiej, aby wysłać zapytanie do wszystkich wiadomości e-mail z jednej tabeli z 150 000 wierszy w tablicy, a następnie sprawdzić tablicę, zamiast wykonywać tysiące WYBORÓW MySQL.
Oto Zapytanie:
SELECT count(contacted_emails.id), contacted_emails.email
FROM contacted_emails
LEFT OUTER JOIN blacklist ON contacted_emails.email = blacklist.email
LEFT OUTER JOIN submission_authors ON contacted_emails.email = submission_authors.email
LEFT OUTER JOIN users ON contacted_emails.email = users.email
GROUP BY contacted_emails.email
HAVING count(contacted_emails.id) > 3
Indeksy w 4 stoły są:
contacted_emails: id, blacklist_section_id, journal_id and mail
blacklist: id, email and name
submission_authors: id, hash_key and email
users: id, email, firstname, lastname, editor_id, title_id, country_id, workplace_id
jobtype_id
The contacted_emails stołowych jest tworzony na przykład:
CREATE TABLE contacted_emails (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
email varchar(150) COLLATE utf8_unicode_ci NOT NULL,
contacted_at datetime NOT NULL,
created_at datetime NOT NULL,
blacklist_section_id int(11) unsigned NOT NULL,
journal_id int(10) DEFAULT NULL,
PRIMARY KEY (id),
KEY blacklist_section_id (blacklist_section_id),
KEY journal_id (journal_id),
KEY email (email))
ENGINE=InnoDB AUTO_INCREMENT=4491706 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Zgodnie z ogólną zasadą SQL będzie ZAWSZE szybszy niż PHP. Jeśli twoje zapytanie trwa 5 minut, nawet z milionami rekordów i wieloma połączeniami, założę się, że jest gdzieś nieoptymalna składnia lub brakujący indeks. Powinieneś wykonać polecenie EXPLAIN, aby sprawdzić plan wykonania zapytania w celu dalszej optymalizacji. –
Powinieneś odesłać bardziej szczegółowe pytanie pokazujące twoje zapytanie i WYJAŚNIJ wyjście i zobacz czy ktoś może to naprawić. –
@StevenMoseley, dzięki. Proszę zobaczyć zapytanie w edytowanym pytaniu. Duża tabela to contacted_emails, która ma 10 Mio wierszy. Muszę wiedzieć, który e-mail znajduje się w contacted_mails, a nie w użytkownikach, a nie w submode_authors i skontaktowano się z nim ponad 3 razy. –