Bạn hỏi " tại sao việc này mất quá nhiều thời gian ?". Bạn cũng nói " Thật không may, việc này mất hơn 5 giây để lấy dữ liệu và hiển thị chúng cho tôi ". Ngoài ra, bạn đã báo cáo đầu ra hồ sơ của truy vấn của bạn.
Như bạn có thể thấy chính mình, tổng số lần được trình hồ sơ báo cáo cho mỗi bước được tính là 0,000154 giây. Vì vậy, từ quan điểm của trình hồ sơ, truy vấn đã được hoàn thành trong thời gian như vậy (0,000154).
Vậy tại sao bạn nhận được kết quả trong " ... hơn 5 giây? ".
Bạn nói rằng bạn đang lọc một bảng kỷ lục 23 triệu với trường 3 char. Thật không may, bạn không cho chúng tôi biết có bao nhiêu bản ghi truy vấn của bạn đang trả về ... nhưng nhờ có GIẢI THÍCH GIẢI THÍCH được cung cấp, có vẻ như truy vấn của bạn đã trả về 336052 bản ghi.
Dường như, tất cả hoạt động của bạn đều chạy qua một số GUI (PHPMyAdmin?).
Vì vậy, sau tất cả những điều trên, chúng tôi có thể định dạng lại câu hỏi ban đầu của bạn là:
"tại sao tôi nhận được, trong GUI của tôi, các bản ghi 336.052 được hiển thị trong hơn 5 giây, nếu thời gian thực hiện MySQL cho truy vấn có liên quan là 0,000154 giây?"
Câu trả lời, theo tôi, khá đơn giản: 5 giây là thời gian (thực sự rất thấp) để cho phép các bản ghi 336.052 đi dọc theo đường dẫn: MySQL engine => thư viện máy khách MySQL => mô-đun MySQL MySQL => Apache => Mạng = > ngăn xếp TCP / IP PC của bạn => Trình duyệt => Trình phân tích cú pháp / trình tạo DOM / v.v. => Trang HTML được kết xuất.
Đối với kinh nghiệm trước đây của tôi, thời gian cần thiết để truyền kết quả là "thông thường" cao hơn nhiều so với thời gian cần thiết để truy xuất dữ liệu đó. Điều này đặc biệt đúng khi các thư viện như PHP-MySQL hoặc Perl-DBD-MySQL có liên quan: chúng thực sự đòi hỏi nhiều thời gian để lấy lại các bản ghi, sau khi MySQL đã xác định đúng (... và trích xuất) tất cả chúng.
Làm thế nào để giải quyết vấn đề này?
Một lần nữa, khá dễ dàng: bạn có thực sự chắc chắn rằng bạn cần TẤT CẢ bản ghi 336.052, trong một tập dữ liệu duy nhất, toàn bộ không?
Nếu câu trả lời của bạn thực sự là "CÓ! Tôi cần tất cả trong số họ", thì ứng dụng của bạn sẽ tự xử lý PAGINATION và / hoặc NGƯỜI DÙNG tương tác và ... một khi đã thu thập được tất cả dữ liệu đó, có lẽ nó sẽ tốn rất nhiều thời gian tương tác với người dùng mà không yêu cầu bất kỳ tương tác MySQL nào nữa. Trong trường hợp như vậy, chờ trong 5 giây (hoặc thậm chí nhiều hơn) không phải là vấn đề;
Nếu câu trả lời của bạn là "KHÔNG, tôi muốn xử lý kích thước tập dữ liệu" con người "nhiều hơn, hơn là bạn phải tinh chỉnh truy vấn của mình (ít nhất) để nó sẽ trả lại cho bạn bộ dữ liệu" người "hơn (hàng chục hoặc, hàng trăm, nhiều nhất, hồ sơ). Trong trường hợp như vậy, tôi cá rằng bạn sẽ nhận được kết quả của mình trong thời gian ngắn hơn.
BTW: đây chính xác là cùng một vấn đề bạn gặp phải trong bài đăng khác này , tại ServerFault: 88 giây để cho 132M bản ghi di chuyển dọc theo con đường ma thuật .... không liên quan đến mysql :-)