Một trong các truy vấn của tôi trên MySQL 5.0.45 đang chạy chậm trong giai đoạn "gửi dữ liệu". Truy vấn là một lựa chọn đơn giản, trả về khoảng 300 trường ID nguyên như tập kết quả.MySql - chậm gửi dữ liệu giai đoạn
mysql> SELECT source_id FROM directions WHERE (destination_id = 10); +-----------+ | source_id | +-----------+ | 2 | | 8 | ... | 2563 | +-----------+ 341 rows in set (2.13 sec)
Tôi lưu ý rằng tại sao giai đoạn "gửi dữ liệu" quá chậm và có thể làm gì để thực hiện nhanh. Xin lưu ý tôi đang thực hiện truy vấn này trên dấu nhắc MySQL trên chính máy chủ, vì vậy không thực sự mong đợi nó dành nhiều thời gian trong việc "gửi dữ liệu". Bất kì manh mối nào?
Nếu nó giúp, tôi có 3 trường văn bản trên bảng này, nhưng vì chúng không được chọn, tôi hy vọng chúng không phải là nguyên nhân của sự chậm trễ này.
Truy vấn này chạy hàng nghìn lần mỗi ngày và thực sự không thể chi tiêu 2 giây mỗi lần.
kết quả Profiling:
mysql> show profile for query 4; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | (initialization) | 0.000003 | | checking query cache for query | 0.000051 | | checking permissions | 0.000007 | | Opening tables | 0.000011 | | System lock | 0.000005 | | Table lock | 0.000023 | | init | 0.00002 | | optimizing | 0.00001 | | statistics | 0.00006 | | preparing | 0.000014 | | executing | 0.000005 | | Sending data | 2.127019 | | end | 0.000015 | | query end | 0.000004 | | storing result in query cache | 0.000039 | | freeing items | 0.000011 | | closing tables | 0.000007 | | logging slow query | 0.000047 | +--------------------------------+----------+ 18 rows in set (0.00 sec)
UPDATE: tôi stumbled khi các URL sau đó nói
Each time means the time elapsed between the previous event and the new event. So, the line: | Sending data | 0.00016800 | means that 0.00016800 seconds elapsed between "executing" and "Sending data". It is, it takes 0.00016800 seconds to execute the query.
http://forums.mysql.com/read.php?24,241461,242012#msg-242012
Ai đó có thể xác nhận?
Những tuyên bố là không đúng sự thật trên trang được liên kết. Nếu bạn thực hiện 'SHOW PROCESSLIST' trong khi truy vấn đang chạy nó sẽ cho thấy rằng truy vấn thực sự ở trạng thái ** Sending data **. (Không phải trong phần trước). - Và vui lòng không ai nói rằng danh sách xử lý đang hiển thị bước * tiếp theo * trong quá trình thực hiện. :) – vbence
@vbence: bạn đã bao giờ thấy một truy vấn mất nhiều hơn một vài người để chạy? Lý thuyết trên có ý nghĩa. –
@ user9111337 Ồ vâng. Báo cáo tổng hợp (GROUP BY) với WHERE caluse thường sẽ dẫn đến các lựa chọn không thể giải quyết bằng cách sử dụng chỉ mục (EXPLAIN ... sẽ nói "SỬ DỤNG WHERE") - nếu bảng đủ lớn, quá trình này có thể mất vài phút. - Báo cáo này được báo cáo như thế nào? Bạn có thể thấy nó cho chính mình bằng cách thử một 'SHOW PROCESSLIST'. – vbence