2015-12-16 13 views
5

Tôi biết rằng truy vấn SQL sẽ sử dụng bộ đệm truy vấn để nhận dữ liệu thay vì xử lý lại tất cả dữ liệu. Đây là câu hỏi tôi muốn hỏi,Bộ đệm truy vấn SQL

tôi làm việc với một máy chủ cơ sở dữ liệu và tôi là một trong những nhà phát triển làm việc trên đó và tôi cần phải làm kiểm tra hiệu suất trên các truy vấn mà tôi xử lý

Nếu tôi xóa bộ nhớ cache truy vấn ví dụ bằng cách sử dụng FLUSH QUERY CACHE; hoặc RESET QUERY CACHE;,

nó sẽ ảnh hưởng đến nhà phát triển khác hoặc nó chỉ xóa bộ nhớ cache truy vấn cục bộ của tôi?

Nếu nó sẽ ảnh hưởng đến những người khác, có cách nào để xóa địa phương hoặc cho phép truy vấn của tôi sẽ không sử dụng bộ nhớ cache truy vấn để thử nghiệm

+0

Tôi đặt SQL Server trở lại và thêm SQL vì câu hỏi này hiện không chỉ liên quan đến MySQL. –

Trả lời

2

Hai làm rõ để bắt đầu với:

  • bộ nhớ cache truy vấn MySQL là một tính năng server-side, không có những điều như "bộ nhớ cache địa phương". Có thể bạn đang nhầm lẫn với từ khóa LOCAL trong lệnh FLUSH. Như docs giải thích nó chỉ là một bí danh cho NO_WRITE_TO_BINLOG (do đó nó liên quan đến nhân rộng và "địa phương" có nghĩa là "máy chủ này").

  • MySQL sẽ chỉ trả lại dữ liệu được lưu trong bộ nhớ cache nếu bạn đã bật tính năng và làm cho nó được đặt mặc định hoặc chọn tham gia với gợi ý SQL_CACHE. Theo kinh nghiệm của tôi, hầu hết các máy chủ không có nó theo mặc định.

Bây giờ hãy trả lời câu hỏi của bạn. Tại The MySQL Query Cache chúng ta có thể đọc:

Bộ nhớ cache truy vấn được chia sẻ giữa phiên, do đó, một tập kết quả được tạo ra bởi một khách hàng có thể được gửi để đáp ứng với cùng một truy vấn do khác khách hàng.

Có nghĩa là: bộ nhớ cache không thể sử dụng lại dữ liệu được lưu trữ không hữu ích.

Tôi không biết bạn muốn kiểm tra chính xác điều gì. Dữ liệu của bạn phải luôn mới:

Bộ nhớ cache truy vấn không trả về dữ liệu cũ. Khi bảng được sửa đổi, mọi mục nhập có liên quan trong bộ đệm truy vấn bị xóa.

Tuy nhiên, bạn có thể muốn biết thời gian chạy truy vấn. Bạn luôn có thể chọn không tham gia với the SQL_NO_CACHE keyword:

Máy chủ không sử dụng bộ đệm truy vấn. Nó không kiểm tra bộ nhớ cache truy vấn để xem liệu kết quả đã được lưu trong bộ nhớ cache hay chưa, cũng không phải bộ nhớ cache kết quả truy vấn.

Chỉ cần tính đến truy vấn chạy lần thứ hai có thể chạy nhanh hơn ngay cả khi không có bộ nhớ cache vì một phần của phân đoạn dữ liệu có thể đã được tải vào RAM.

1

Hãy thử sử dụng các tùy chọn SQL_NO_CACHE ở với truy vấn của bạn sẽ ngừng MySQL bộ nhớ đệm kết quả

SELECT SQL_NO_CACHE * FROM TABLE 
+1

Chỉ hoạt động với SELECT *? bởi vì khi tôi sử dụng nó như SELECT SQL_NO_CACHE [value] FROM TABLE, nó đã tuyên bố tên cột không hợp lệ cho SQL_NO_CACHE – Dean

+0

đọc thêm http://dev.mysql.com/doc/refman/5.7/en/query-cache-in-select. html @Dean –

+1

@Dean Đây là phần mở rộng của MySQL; cú pháp sẽ không hoạt động trên các DBMS khác. –

1

với SQL server cho dữ liệu lưu trữ, bạn có thể sử dụng DBCC DROPCLEANBUFFERS và buộc một Manul CHECKPOINT.

Tuy nhiên nó hoạt động ở Server (ví dụ) mức:

Sử dụng DBCC DROPCLEANBUFFERS để kiểm tra truy vấn với một bộ nhớ cache đệm lạnh mà không cần tắt và khởi động lại máy chủ.

Để xóa bộ đệm sạch khỏi vùng đệm, trước tiên hãy sử dụng CHECKPOINT để tạo bộ đệm đệm bộ đệm lạnh. Điều này buộc tất cả các trang bẩn cho cơ sở dữ liệu hiện tại được ghi vào đĩa và dọn dẹp bộ đệm. Sau khi bạn làm điều này, bạn có thể ra lệnh DBCC DROPCLEANBUFFERS để loại bỏ tất cả bộ đệm từ vùng đệm.

sửa *

SQL Query đệm Cache là toàn cầu nhưng không phải địa phương. Nếu bộ đệm hoặc bộ nhớ cache truy vấn bị xóa, nó sẽ xóa nó trên toàn cầu và sẽ ảnh hưởng đến tất cả người dùng bằng máy chủ cơ sở dữ liệu.

+0

Vì vậy ... 'DBCC DROPCLEANBUFFERS' là dọn sạch bộ đệm đệm cho toàn bộ máy chủ? .. và có cách nào để xóa nó cục bộ nhưng không phải toàn bộ máy chủ? – Dean

+0

CHECKPOINT ghi lại tất cả mọi thứ từ bộ nhớ vào đĩa và sau đó DROPCLEANBUFFERS xóa bộ đệm (vì mọi thứ đã được ghi lại). Nhưng điều này là dành cho SQL Server (trước khi bạn đề cập đến nó là MySQL). Nó xóa toàn bộ bộ đệm trên máy chủ. Bộ nhớ cache là toàn cục đối với cá thể SQL Server, cho tất cả mọi người và không được liên kết với một người dùng cụ thể. –

+0

ok .. cảm ơn .. Nó có thể giống như MySQL mà bộ đệm được lưu trên toàn cầu. không hoàn toàn chắc chắn được nêu ra .. sẽ làm vài nghiên cứu thêm nếu có tôi tag nó như là giải pháp cho cả MySQL và SQL Server – Dean

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