Ich muss einige Daten von MySQL DB mit PHP auswählen. Es kann innerhalb einer einzigen MySQL-Abfrage ausgeführt werden, die 5 Minuten dauert, um auf einem guten Server ausgeführt zu werden (mehrere JOINs in Tabellen mit mehr als 10 Millionen Zeilen).Langsame MySQL-Abfrage - Cache die Daten in einem PHP-Array?
Ich frage mich, ob es eine bessere Praxis ist, die Abfrage in PHP aufzuteilen und einige Schleifen anstelle von MySQL zu verwenden. Außerdem wäre es besser, alle E-Mails von einer Tabelle mit 150 000 Zeilen in einem Array abzufragen und dann das Array zu überprüfen, anstatt Tausende von MySQL-SELECTs auszuführen.
Hier ist die Abfrage:
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
Die Indizes in den 4 Tabellen sind:
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
der Tabelle contacted_emails erstellt wie:
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
Als allgemeine Regel gilt, dass SQL immer schneller ist als PHP. Wenn Ihre Abfrage 5 Minuten dauert, sogar mit Millionen von Datensätzen und mehreren Joins, wette ich, dass es irgendwo eine suboptimale Syntax oder einen fehlenden Index gibt. Sie sollten ein EXPLAIN ausführen, um den Ausführungsplan Ihrer Abfrage zur weiteren Optimierung zu überprüfen. –
Sie sollten eine spezifischere Frage, die Ihre Abfrage und EXPLAIN-Ausgabe zeigt, erneut senden und sehen, ob jemand sie beheben kann. –
@StevenMoseley, danke. Bitte beachten Sie die Abfrage in der bearbeiteten Frage. Die große Tabelle ist contact_emails mit 10 Millionen Zeilen. Ich muss wissen, welche E-Mail in den contact_mails und nicht in Benutzern und nicht in submission_authors ist, und wurde mehr als 3 mal kontaktiert. –