Meine Vermutung ist, dass Sie mit einem unsigned int und einem varchar 40 (insbesondere dem varchar!) Jetzt einen RIESIGEN Primärschlüssel haben und Ihre Indexdatei zu groß wird, um in den RAM zu passen, den Sie für Innodb_buffer_pool haben. Dies würde dazu führen, dass sich InnoDB auf die Festplatte verlassen müsste, um Indexseiten während der Suche auszutauschen, und das bedeutet eine Menge Festplattensuchen und nicht viel CPU-Arbeit.
Eine Sache, die ich für ein ähnliches Problem getan habe, ist, etwas zwischen einem wirklich natürlichen Schlüssel und einem Ersatzschlüssel zu verwenden. Wir würden die 2 Felder nehmen, die tatsächlich einzigartig sind (von denen eines auch ein Varchar war), und in der Anwendungsschicht einen MD5-Hash mit fester Breite erstellen und DAS als Schlüssel verwenden. Ja, es bedeutet mehr Arbeit für die App, aber es führt zu einer viel kleineren Indexdatei, da Sie kein beliebig langes Feld mehr verwenden.
ODER, Sie könnten einfach einen Server mit Tonnen von RAM verwenden und sehen, ob der Index dadurch in den Speicher passt, aber ich mache es immer gerne, Hardware darauf zu werfen, als letzten Ausweg :)