私の勘では、unsignedintとvarchar40(特にvarchar!)を使用すると、巨大な主キーが作成され、インデックスファイルが大きくなりすぎてInnodb_buffer_pool用のRAMに収まりません。これにより、InnoDBは検索時にインデックスページをスワップするためにディスクに依存する必要があります。これは多くのディスクシークであり、CPUの作業量は多くありません。
同様の問題に対して私が行ったことの1つは、真に自然キーと代理キーの間に何かを使用することです。実際に一意である2つのフィールド(そのうちの1つはvarcharでもあります)を取得し、アプリケーション層で固定幅のMD5ハッシュを作成し、それをキーとして使用します。はい、それはアプリにとってより多くの作業を意味しますが、任意の長さのフィールドを使用しなくなったため、インデックスファイルがはるかに小さくなります。
または、大量のRAMを搭載したサーバーを使用して、インデックスがメモリに収まるかどうかを確認することもできますが、私は常に「ハードウェアを投入する」ことを最後の手段にするのが好きです:)