2011-11-27 60 views
11

Tôi vừa mới bật slow query logging trên cơ sở dữ liệu MySQL của tôi, thêm dòng sau vào /etc/mysql/my.cnf:"SELECT/*! N SQL_NO_CACHE */* FROM` mytable` có nghĩa là gì trong nhật ký truy vấn chậm của MySQL?

log_slow_queries = /var/log/mysql/mysql-slow.log 
long_query_time = 1 

Khi tôi chạy mysqldumpslow, nó ra như sau:

Reading mysql slow query log from mysql-slow.log 
Count: 1 Time=199.23s (199s) Lock=0.00s (0s) Rows=32513.0 (32513), ... 
SELECT /*!N SQL_NO_CACHE */ * FROM `mytable` 

... 

Nhìn vào bản gốc mysql-slow.log, truy vấn đầy đủ là:

SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`; 

Vì vậy, mysqldumpslow vừa thay thế số với N (để hỗ trợ tổng hợp các truy vấn tương tự.)

Vì vậy, câu hỏi là, truy vấn đó đến từ đâu và ý nghĩa của bit /*!40001 SQL_NO_CACHE */ là gì?

Tốt nhất tôi có thể nói, có thể là từ lệnh mysqldump đang thực hiện sao lưu (do đó không muốn dữ liệu được lưu trong bộ nhớ cache), điều đó có đúng không? Và nếu có, vì nó chỉ đọc 32.000 hàng, tại sao nó mất 199s?

Có một loạt các truy vấn tương tự trên các bảng khác lấy 100s, 50s, xuống 3s hợp lý hơn, hầu hết có khoảng 10-20.000 hàng, lớn nhất với 450.000 hàng.

+0

có thể bạn có thể chấp nhận câu trả lời tốt hơn bên dưới? – rubo77

Trả lời

4

Truy vấn có thể 'chậm' vì máy khách (hệ thống dự phòng của bạn) phải đọc từng hàng trong bảng của bạn; đang diễn ra trong 199 giây.

Lưu ý rằng nếu bạn đã làm điều gì đó như:

SELECT * FROM table LIMIT 100; 

// read 50 rows 

// sleep for 5 minutes 

// read last 50 rows 

Các truy vấn trên sẽ xuất hiện trong bản ghi chậm, bởi vì từ khi nó lần đầu tiên bắt đầu, đến khi nó có thể kết thúc (bằng cách gửi bạn hàng yêu cầu cuối cùng) mất 5 phút.

+1

Nhưng "hệ thống sao lưu" là mysqldump, chắc chắn không mất 200 giây để viết 32.000 hàng? – Tom

+2

Trên thực tế, nếu nó gửi qua ssh (thông qua gzip) có thể giữ cho nó mở cho đến khi dữ liệu được chuyển ... – Tom

+0

Thực hiện SHOW PROCESSLIST khi truy vấn đang chạy, nếu trạng thái của nó là 'write to net' (I suy nghĩ) sau đó nó gửi dữ liệu nhanh như đầu kia của bạn đang xử lý nó. – Andrew

22

/*!40001 SQL_NO_CACHE */ có nghĩa là trong các phiên bản của mysql> = 4.0.1 thực hiện SELECT SQL_NO_CACHE * FROM mytable và trong các phiên bản trước đó thực thi lệnh mà không có SQL_NO_CACHE.

Ngoài ra mysqldump không sử dụng cú pháp /*!40001 SQL_NO_CACHE */.

Tôi không chắc chắn tại sao các truy vấn của bạn sẽ quá chậm.

+0

Ah, số phiên bản! Tôi nghĩ rằng nó có thể là một mã lỗi hoặc một cái gì đó. Đó là điều cần biết, có bất kỳ tài liệu nào cho cú pháp đó không? – Tom

+0

Vâng, bạn có thể tìm thấy một số thông tin trên trang web MySQL tại: http://dev.mysql.com/doc/refman/5.1/en/comments.html –

+0

Đây phải là câu trả lời đúng. Tôi không cho rằng câu hỏi chính là: "Tại sao truy vấn của tôi chậm?" Ít nhất không có trong tiêu đề –

3

Một vấn đề điều chỉnh có thể được bạn xem xét để làm cho truy vấn này chạy nhanh hơn, btw, SQL_NO_CACHE có nghĩa là truy vấn này sẽ chạy mà không đủ điều kiện để được lưu trữ trong bộ đệm truy vấn. Ví dụ, bạn có thể sử dụng HINT, SQL_NO_CACHE này, để tránh truy vấn này được lưu trữ để kiểm tra thời gian thực hiện đó.

Check it out: http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html

More GỢI Ý để sử dụng vào các truy vấn: http://www.petefreitag.com/item/613.cfm

Chúc mừng, WB

-1

Từ công việc của tôi, tôi cũng phải đối mặt với cùng một vấn đề Sau đó, tôi đã cố gắng trong hai cách để giải quyết nó.

Thứ nhất, tôi đã tăng kích thước mysql_query_cache và tăng không gian trong Máy cục bộ.

Thứ hai, tôi đã kiểm tra máy chủ từ xa kích thước mysql_query_cache và tăng không gian thư mục tạm thời.

Bởi vì, Điều tôi nhận được từ nghiên cứu rằng hệ thống này đang hoạt động theo cả hai cách và cho chúng tôi cảm giác rằng chúng tôi phải tăng không gian ở địa điểm cụ thể.

Vì vậy, hãy nêu cụ thể mysqldum p bạn đang sử dụng và kiểm tra phiên bản cũng dành cho cả hai hệ thống. Như phiên bản khác nhau cũng cư xử hơi khác nhau.

+2

Tôi không thấy cách này trả lời câu hỏi được hỏi? – Carpetsmoker

+0

Tôi gặp lỗi tương tự và tôi đã giải quyết vấn đề này bằng các bước đó. Tôi có nghĩa là nó không liên quan đến nhật ký truy vấn chậm. Đó là về kích thước không gian trong hệ thống. Đó là cách câu trả lời liên quan đến câu hỏi. – Sumsun

+1

Nhưng câu hỏi này không phải là về lỗi, nhưng yêu cầu giải thích về ý nghĩa của một cái gì đó? – Carpetsmoker

Các vấn đề liên quan