2017-05-18 3 views
2

Ich habe Aktivität, Kontakt, Benutzer, deleted_contact Tabelle in meiner Datenbank.Zeilen aus 4 Tabellen in MySQL mit schwerer Datenbank holen

  • Aktivitätstabelle hat 5 Millionen Zeilen
  • Kontakttabelle hat 5 Millionen Zeilen
  • Benutzertabelle hat 5000 Zeilen
  • delete_contact Tabelle hat 850.000 Zeilen

Nun mein Problem ist, dass, wenn ich Ich versuche, holen nur 10 Zeilen von beitreten alle Tabellen, nimmt mysql zu viel Last und irgendwann meine App totall y hört auf zu arbeiten.

Ich bin links verbinden. Bitte schlagen Sie mir den besten Weg vor, nur 10 Reihen von über vier Tischen zu nehmen.

Ich habe folgende Anfrage: -

SELECT activity.id, 
     activity.ipaddress, 
     deleted_contact.name, 
     activity.city, 
     activity.country, 
     activity.state, 
     activity.user_agent, 
     activity.browser_name, 
     activity.os_platform, 
     activity.details AS details, 
     activity.file_name AS filename, 
     activity.created_at AS Date, 
     activity.model_id, 
     activity.user_id, 
     activity.contact_id, 
     activity.type, 
     activity.city, 
     activity.state, 
     activity.country, 
     contact.name AS Contact, 
     email.subject AS emailsubject, 
     email.opened, 
     email.schedule_date, 
     email.schedule_timezone, 
FROM activity 
LEFT JOIN contact ON activity.contact_id = contact.id 
LEFT JOIN email ON activity.model_id = email.id 
LEFT JOIN user ON activity.user_id = user.id 
LEFT JOIN deleted_contact ON deleted_contact.contact_id = activity.contact_id 
WHERE activity.user_id IN (2, 
          56, 
          78, 
          93, 
          105, 
          2004, 
          345, 
          450, 
          321, 
          456) 
GROUP BY activity.id, 
     email.id 
ORDER BY activity.id DESC LIMIT 0, 
           10 
+4

Bitte fügen Sie die Abfrage und einige weitere Informationen über die Tabellenstruktur wie die Indizes usw. – Sirko

+0

Wie lange dauert es Wenn Sie die Abfrage in mysql (im Gegensatz zu in der App) –

+0

In meiner Aktivität Tabelle I Indizes für user_id nicht eindeutig, model_id nicht eindeutig, contact_id nicht eindeutig, Benachrichtigung nicht eindeutig und created_at nicht eindeutig. –

Antwort

0

Schließlich fand ich seine Antwort. Wenn ich die Abfrage in phpMyAdmin ausführte, zeigte es mir, dass es eine temporäre Tabelle erstellt, da es aus der Aktivitätstabelle 26000 Zeilen von diesen Benutzern hat und ich die Gruppe am Ende meiner Abfrage anwende. Also habe ich die Gruppe entfernt, indem ich sehr schnelle Ergebnisse mit nur 0,26 sec bekommen habe.

1

Ich weiß nicht, Ihre Datenbank, und ich kann meinen Code nicht beweisen, aber die Idee ist, wählen Sie diese 10 Zeilen mit einem subselect, bevor alle Tabellen verbinden. Dies sollte schneller als sonst funktionieren.

SELECT act.id, 
     act.ipaddress, 
     deleted_contact.name, 
     act.city, 
     act.country, 
     act.state, 
     act.user_agent, 
     act.browser_name, 
     act.os_platform, 
     act.details AS details, 
     act.file_name AS filename, 
     act.created_at AS Date, 
     act.model_id, 
     act.user_id, 
     act.contact_id, 
     act.type, 
     act.city, 
     act.state, 
     act.country, 
     contact.name AS Contact, 
     email.subject AS emailsubject, 
     email.opened, 
     email.schedule_date, 
     email.schedule_timezone, 
FROM 
    (SELECT activity.id, 
     activity.ipaddress, 
     activity.city, 
     activity.country, 
     activity.state, 
     activity.user_agent, 
     activity.browser_name, 
     activity.os_platform, 
     activity.details AS details, 
     activity.file_name AS filename, 
     activity.created_at AS Date, 
     activity.model_id, 
     activity.user_id, 
     activity.contact_id, 
     activity.type, 
     activity.city, 
     activity.state, 
     activity.country 
     FROM activity WHERE activity.user_id IN (2,56,78,93,105,2004,345,450,321,456) AS act) 
LEFT JOIN contact ON act.contact_id = contact.id 
LEFT JOIN email ON act.model_id = email.id 
LEFT JOIN user ON act.user_id = user.id 
LEFT JOIN deleted_contact ON deleted_contact.contact_id = act.contact_id 
GROUP BY act.id, 
     email.id 
ORDER BY act.id DESC LIMIT 0,10 
+0

Eigentlich habe ich Ihre Abfrage direkt in meinem Live-Server phpmyadmin mit "Explain" Schlüsselwort versucht, so dass ich "temporary; Using filesort" in column von "Extra" für "activity table" gefunden habe, so denke ich, es erstellt temporäre Tabelle mit 28700 Zeilen, also läuft es tatsächlich runter. Also bitte sende mir –

+0

Kannst du mir die Ausführungszeiten und die beiden Versionen der Abfrage erklären? Also könnte ich es dir ansehen und dir etwas sagen. – Rocio

Verwandte Themen