Zunächst einmal bezieht sich diese Frage auf MySQL 3.23.58, also seien Sie vorsichtig.
Ich habe 2 Tabellen mit der folgenden Definition:
Table A: id INT (primary), customer_id INT, offlineid INT
Table B: id INT (primary), name VARCHAR(255)
Tabelle A enthält nun etwa 65k+ Datensätze, während Tabelle B etwa 40 Datensätze enthält. Zusätzlich zu den 2 Primärschlüsselindizes gibt es auch einen Index für die offlineid Es gibt noch weitere Felder in jeder Tabelle, die aber für diese Abfrage nicht relevant sind (wie ich es sehe, fragen Sie, wenn nötig).
Zunächst wurde mir die folgende Abfrage vorgelegt ( Abfragezeit: ~22 Sekunden ):
SELECT b.name, COUNT(*) AS orders, COUNT(DISTINCT(a.kundeid)) AS leads
FROM katalogbestilling_katalog a, medie b
WHERE a.offlineid = b.id
GROUP BY b.name
Nun ist jede ID in medie mit einem anderen Namen verknüpft, so dass Sie sowohl nach ID als auch nach Namen gruppieren können. Nach einigem Hin- und Herprobieren bin ich zu diesem Schluss gekommen ( Abfragezeit: ~6 Sekunden ):
SELECT a.name, COUNT(*) AS orders, COUNT(DISTINCT(b.kundeid)) AS leads
FROM medie a
INNER JOIN katalogbestilling_katalog b ON a.id = b.offline
GROUP BY b.offline;
Gibt es eine Möglichkeit, es auf "sofortige" Zeit (höchstens 1 Sekunde im schlimmsten Fall) zu verkürzen? Ich habe den Index auf offlineid hinzugefügt, aber abgesehen davon und der Neuanordnung der Abfrage weiß ich nicht, was ich tun soll. Die EXPLAIN-Abfrage zeigt mir, dass die Abfrage fileshort verwendet (die ursprüngliche Abfrage verwendete auch temporäre Tabellen). Alle Vorschläge sind willkommen!