MySQL - buộc không sử dụng bộ đệm để kiểm tra tốc độ truy vấn


343

Tôi đang kiểm tra tốc độ của một số truy vấn trong MySQL. Cơ sở dữ liệu đang lưu trữ các truy vấn này khiến tôi khó có được kết quả đáng tin cậy khi kiểm tra các truy vấn này nhanh như thế nào.

Có cách nào để vô hiệu hóa bộ đệm ẩn cho một truy vấn không?

Hệ thống: MySQL 4 trên webhosting Linux, tôi có quyền truy cập vào PHPMyAdmin.

Cảm ơn

mysql 

Câu trả lời:


527

Hãy thử sử dụng tùy chọn SQL_NO_CACHE (MySQL 5.7) trong truy vấn của bạn. (Người dùng MySQL 5.6 bấm vào ĐÂY )

ví dụ.

SELECT SQL_NO_CACHE * FROM TABLE

Điều này sẽ ngăn MySQL lưu lại các kết quả, tuy nhiên hãy lưu ý rằng các bộ đệm hệ điều hành và ổ đĩa khác cũng có thể ảnh hưởng đến hiệu suất. Đây là những khó khăn hơn để có được xung quanh.



4
Một bài viết hay về bộ nhớ cache mysql Query. Làm thế nào để thiết lập và xem bộ đệm trong hành động! Đáng để đọc. cơ sở dữ
Adrian P.

1
Trước khi cố gắng cải thiện hiệu suất, hãy thử khởi động lại máy chủ mysql của bạn. Nó có thể là một số quá trình đang ảnh hưởng đến tất cả mọi thứ. Nó đã xảy ra với tôi. Mặc dù đó là một bình luận không có mối liên hệ trực tiếp với vấn đề này, nhưng nó có thể giúp nhiều người.
dellasavia

2
Điều này ngăn nó lưu bộ đệm vào kết quả nhưng nó cũng ngăn nó sử dụng bộ đệm?
Brett

3
@Brett thấy cách nhận xét của SalmanPK trở lại trong '11. Trang doc đó đúng nghĩa là 4 câu và trả lời câu hỏi của bạn trực tiếp. Trong trường hợp trang bị xóa trong tương lai: "Nó không kiểm tra bộ đệm truy vấn để xem liệu kết quả đã được lưu trong bộ nhớ cache hay chưa, cũng không lưu bộ đệm kết quả truy vấn."
maurice

121

Một cách khác chỉ ảnh hưởng đến kết nối hiện tại:

SET SESSION query_cache_type=0;

Lỗi của tôi. Đó là query_cache_sizetôi đang nhìn, không phải query_cache_type. Tôi đã trộn lẫn câu trả lời của bạn và SeniorDev.
Mike


30

Ngoài ra còn có tùy chọn cấu hình: query_cache_size = 0

Để vô hiệu hóa bộ đệm truy vấn khi máy chủ khởi động, hãy đặt biến hệ thống query_cache_size thành 0. Bằng cách vô hiệu hóa mã bộ đệm truy vấn, không có chi phí đáng chú ý. Nếu bạn xây dựng MySQL từ nguồn, các khả năng bộ đệm truy vấn có thể được loại trừ hoàn toàn khỏi máy chủ bằng cách gọi cấu hình với tùy chọn --without-query-cache.

Xem http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


24

Bạn cũng có thể chạy lệnh follow để đặt lại bộ đệm truy vấn.

RESET QUERY CACHE

9
Điều này có thể là quá mức cần thiết ... lý tưởng, bạn chỉ muốn MySQL tạm thời bỏ qua bộ đệm.
BMiner

3
Bạn cũng cần quyền đặc biệt cho việc này.
Erick Robertson

19

Một vấn đề với

SELECT SQL_NO_CACHE * FROM TABLE

phương pháp là dường như chỉ ngăn kết quả truy vấn của bạn được lưu vào bộ đệm. Tuy nhiên, nếu bạn đang truy vấn cơ sở dữ liệu đang được sử dụng tích cực với truy vấn bạn muốn kiểm tra, thì các máy khách khác có thể lưu trữ truy vấn của bạn, ảnh hưởng đến kết quả của bạn. Tôi đang tiếp tục nghiên cứu các cách xung quanh này, sẽ chỉnh sửa bài đăng này nếu tôi tìm ra.


1
Nhưng nếu bộ nhớ cache của bạn bị người khác lấp đầy, bạn sẽ có ảo tưởng là nhanh. Nhưng đôi khi không.
karatedog

14

Tôi sẽ sử dụng như sau:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

Sử dụng biến do người dùng xác định trong truy vấn sẽ khiến truy vấn không thể truy cập được. Tôi thấy nó là một chỉ số tốt hơn nhiều so với việc sử dụng SQL_NO_CACHE. Nhưng bạn nên đặt biến ở nơi mà cài đặt biến sẽ không ảnh hưởng nghiêm trọng đến hiệu suất:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
"Tôi thấy nó là một chỉ số tốt hơn nhiều so với việc sử dụng SQL_NO_CACHE." Làm sao vậy Có vẻ như bạn sẽ cần một trường hợp khá mạnh để sử dụng một bản hack tối nghĩa đối với một từ khóa rõ ràng, trừ khi từ khóa rõ ràng không làm những gì nó tuyên bố.
Không khí

1
@Air Tôi thấy giải pháp này hoạt động tốt hơn SQL_NO_CACHE. SQL_NO_CACHE lần đầu tiên chạy truy vấn, nhưng sau đó nó không hoạt động trở lại. Tôi cho rằng điều này là do các cơ chế lưu trữ khác. Tôi nghĩ rằng điều này hoạt động tốt hơn bởi vì một tìm kiếm dựa trên một biến không thể được lưu trữ bởi bất kỳ lớp hoặc cơ chế nào - ít nhất, đó là phỏng đoán tốt nhất của tôi.
Klik

2

Nếu bạn muốn tắt bộ đệm truy vấn, hãy đặt 'query_cache_size' thành 0 trong tệp cấu hình mysql của bạn. Nếu nó được đặt 0 mysql sẽ không sử dụng bộ đệm truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.