PHP kullanarak MySQL DB'den bazı verileri seçmem gerekiyor. İyi bir sunucuda çalışmak için 5 dakika süren tek bir MySQL sorgusunda yapılabilir (10 Mio satırında daha fazla tablodaki çoklu JOIN'ler).Yavaş MySQL Sorgu - Bir PHP dizisinde verileri önbelleğe alın?
oldukça MySQL daha PHP sorguyu bölmek ve bazı döngüler kullanmak için daha iyi bir uygulama olup olmadığını merak ediyorum. Ayrıca, bir tablodaki tüm e-postaları bir dizideki 150 000 satır ile sorgulamak ve daha sonra binlerce MySQL SELECT yapmak yerine diziyi kontrol etmek daha iyi olur.
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
AÇIKLAYINIZ döner: Burada
Sorgu 4 tablolardaendeksleri şunlardır:
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
oluşturulur
tablo contacted_emails
jobtype_id gibi: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
Genel kural olarak, SQL her zaman PHP'den daha hızlı olacaktır. Sorgunuz 5 dakika sürüyorsa, milyonlarca kayıt ve birden çok katılımla bile, bir alt-optimal sözdizimi veya eksik bir dizin var. Daha fazla optimizasyon için sorgunuzun yürütme planını kontrol etmek için bir EXPLAIN yapmalısınız. –
Sorgunuzu ve EXPLAIN çıktısını gösteren daha spesifik bir soruyu yeniden yazmalı ve birisinin düzeltip düzeltemeyeceğini görün. –
@StevenMoseley, teşekkürler. Lütfen düzenlenmiş sorudaki sorguya bakın. Büyük tablo 10 Mio satırı olan contacted_emails'tir. Hangi e-postaların contacted_postalarda olduğunu, kullanıcılara değil de submission_authors içinde olduğunu bilmem ve 3 kattan fazla iletişim kurdum. –