Das ist ein überraschend großer Leistungsunterschied, aber ich kann mir ein paar Dinge vorstellen, die dazu beitragen können.
MyISAM wurde in der Vergangenheit als schneller als InnoDB angesehen, aber für neuere Versionen von InnoDB gilt das für eine viel, viel kleinere Reihe von Anwendungsfällen. MyISAM ist in der Regel schneller für Tabellen-Scans von schreibgeschützten Tabellen. In den meisten anderen Anwendungsfällen finde ich InnoDB normalerweise schneller. Oft um ein Vielfaches schneller. Tabellensperren sind ein Todesstoß für MyISAM in den meisten meiner Verwendung von MySQL.
MyISAM speichert Indizes in seinem Schlüsselpuffer. Vielleicht haben Sie den Schlüsselpuffer zu klein eingestellt, um den Index für Ihre etwas größere Tabelle effektiv zwischenzuspeichern.
MyISAM hängt vom Betriebssystem ab, um Tabellendaten aus den .MYD-Dateien im Betriebssystemdatenträgercache zwischenzuspeichern. Wenn das Betriebssystem nicht mehr genügend Arbeitsspeicher zur Verfügung hat, beginnt es seinen Plattencache zu entladen. Das könnte es zwingen, weiter von der Platte zu lesen.
InnoDB speichert beide Indizes und Daten in einem eigenen Speicherpuffer. Sie können das Betriebssystem anweisen, seinen Festplattencache auch nicht zu verwenden, wenn Sie innodb_flush_method auf O_DIRECT festgelegt haben, obwohl dies unter OS X nicht unterstützt wird.
InnoDB puffert normalerweise Daten und Indizes in 16kb Seiten. Je nachdem, wie Sie den Wert von @eid zwischen Abfragen ändern, hat er möglicherweise bereits die Daten für eine Abfrage zwischengespeichert, da die Datenträger von einer vorherigen Abfrage gelesen wurden.
Stellen Sie sicher, dass Sie die Indizes identisch erstellt haben. Verwenden Sie explain, um zu überprüfen, ob MySQL den Index verwendet. Da Sie die Ausgabe von describe anstelle von show create table oder show indexes von enthalten, kann ich nicht sagen, ob entity_id Teil eines zusammengesetzten Indexes ist. Wenn es nicht der erste Teil eines zusammengesetzten Indexes wäre, würde es nicht verwendet werden.
Wenn Sie eine relativ moderne Version von MySQL verwenden, führen Sie den folgenden Befehl vor dem Ausführen der Abfrage:
Satz Profilierung = 1;
Dadurch wird Abfrage Profiling für Ihre Sitzung aktiviert. Nach dem Ausführen der Abfrage führen Sie
zeigen Sie Profile;
Das zeigt Ihnen die Liste der Abfragen, für die Profile verfügbar sind. Ich denke, dass es standardmäßig die letzten 20 hält. Angenommen, Ihre Abfrage war die erste Abfrage:
Profil für Abfrage 1 anzeigen;
Sie sehen dann die Dauer jeder Phase bei der Ausführung Ihrer Abfrage. Dies ist äußerst nützlich zum Bestimmen, was (z. B. Sperren von Tabellen, Sortieren, Erstellen von temporären Tabellen usw.) eine Abfrage verursacht, die langsam ist.
Ein einigermaßen einfacher Test zum Erstellen einer neuen MyISAM -Tabelle und Timing der Abfrage gegen diese Tabelle könnte diese Vermutung bestätigen. –