Linh cảm của tôi là với int unsigned và varchar 40 (đặc biệt là varchar!), Bạn hiện có một khóa chính HUGE và nó đang làm cho tệp chỉ mục của bạn quá lớn để có thể vừa với bất kỳ RAM nào bạn có cho Innodb_buffer_pool. Điều này sẽ khiến InnoDB phải dựa vào đĩa để hoán đổi các trang chỉ mục khi nó tìm kiếm và đó là RẤT NHIỀU lần tìm kiếm đĩa và không có nhiều công việc của CPU.
Một điều tôi đã làm cho một vấn đề tương tự là sử dụng một cái gì đó ở giữa một khóa tự nhiên thực sự và một khóa thay thế. Chúng tôi sẽ lấy 2 trường thực sự là duy nhất (một trong số đó cũng là varchar) và trong lớp ứng dụng sẽ tạo một băm MD5 có chiều rộng cố định và sử dụng THAT làm khóa. Có, nó có nghĩa là ứng dụng sẽ hoạt động nhiều hơn nhưng nó tạo ra một tệp chỉ mục nhỏ hơn nhiều vì bạn không còn sử dụng trường độ dài tùy ý nữa.
HOẶC, bạn có thể chỉ cần sử dụng một máy chủ có hàng tấn RAM và xem liệu điều đó có làm cho chỉ mục này phù hợp với bộ nhớ hay không nhưng tôi luôn muốn đặt mục tiêu cuối cùng là 'ném phần cứng vào nó' :)