Có truy vấn bộ nhớ cache MySQL?


19

Tôi đang kết nối cơ sở dữ liệu MySQL với các đối tượng dữ liệu PHP (PDO) và thực hiện một truy vấn SQL mở rộng. Thông thường, mất khoảng 1500 ms; Tôi vẫn cần tối ưu hóa nó. Khi tôi chạy tập lệnh PHP hai lần với một khoảng thời gian ngắn ở giữa, truy vấn chỉ mất khoảng 90 ms. Các truy vấn là trong cả hai trường hợp như nhau. Khi tôi chạy tập lệnh, với cùng một truy vấn, sau một thời gian nữa, phải mất 1500 ms một lần nữa.

Tại sao vậy? Liệu bộ đệm cơ sở dữ liệu tự động? Có đôi khi cơ sở dữ liệu lưu bộ đệm và sau đó tự động xóa nó?

Tôi giả sử các kết quả không thể được lưu trữ bởi PHP, bởi vì điều này xảy ra trong hai luồng khác nhau. Tôi không nghĩ PHP sẽ lưu trữ các kết quả, bởi vì nó không thể biết liệu cơ sở dữ liệu đã thay đổi hay chưa.

Tôi có một kịch bản chạy mỗi phút để chèn các hàng mới vào cơ sở dữ liệu. Đây cũng có thể là lý do mà phải mất 1500 ms một lần nữa sau một thời gian; bộ đệm sẽ bị xóa vì các bảng có liên quan không còn giống nhau nữa.


Cho tôi xem mã của bạn. Tôi không cần truy vấn của bạn, chỉ là một cách bạn đang kiểm tra nó.

3
Có, myQuery lưu trữ các truy vấn. Thật thông minh như thế.

@Kasyx mã gì? Đó chỉ là PDO cơ bản, nhưng tôi không nghĩ PHP có thể lưu trữ bộ đệm vì tôi chạy tập lệnh PHP hai lần, tôi không chạy truy vấn hai lần trong một tập lệnh. Ngoài ra, bạn có thể giải thích lý do tại sao bạn chỉnh sửa pdo trong khi nó không thực sự phù hợp với câu hỏi?

3
Tất cả các DBMS đều có bộ đệm cấp độ trang nào đó. Nhiều người vượt xa điều đó bằng cách lưu trữ các kế hoạch thực hiện truy vấn hoặc thậm chí kết quả truy vấn (bao gồm cả MySQL ). Tôi nghi ngờ điều cuối cùng này là thủ phạm chính cho hành vi quan sát của bạn.
Branko Dimitrijevic

Bạn đang thực hiện chèn mỗi phút? Sắp xếp ra trước!
Grant Thomas

Câu trả lời:


15

Đây có thể là một tạo tác của Bộ đệm truy vấn MySQL .

Bạn thực hiện truy vấn SQL, MySQL lưu trữ kết quả của nó và thực hiện tiếp theo nếu nhanh. Khi bạn chạy tập lệnh để chèn dữ liệu vào các bảng được tham chiếu bởi truy vấn của bạn, bộ đệm kết quả sẽ bị vô hiệu và truy vấn phải được thực hiện "thực tế" vào lần tiếp theo.

Từ tài liệu MySQL được liên kết ở trên:

Một hỗn hợp truy vấn bao gồm gần như hoàn toàn một tập hợp các câu lệnh CHỌN cố định có nhiều khả năng được hưởng lợi từ việc bật bộ đệm hơn là một hỗn hợp trong đó các câu lệnh INSERT thường xuyên gây ra sự vô hiệu hóa liên tục của kết quả trong bộ đệm.


5

Có, myQuery (chung với tất cả các sản phẩm cơ sở dữ liệu phổ biến khác) lưu trữ các truy vấn được thực hiện cho nó.

Bộ nhớ đệm khá thông minh - nó thường có thể sử dụng bộ đệm cho truy vấn ngay cả khi các tham số chính xác của truy vấn không giống nhau. Điều này có thể tạo ra một sự khác biệt lớn cho hiệu suất.

Bộ nhớ đệm được điều khiển hoàn toàn bên trong phần mềm máy chủ DB; bạn không có bất kỳ khả năng hiển thị nào về bộ đệm chứa gì, cũng như thời gian của một mục đã cho trong bộ đệm; nó có thể được ghi đè tại bất kỳ thời điểm nào tùy thuộc vào những truy vấn khác đang được gọi, v.v. Nó ở đó để hỗ trợ hiệu suất, nhưng không nên dựa vào hiệu suất.

Bạn có thể đọc thêm về nó ở đây trong hướng dẫn sử dụng MySQL .

Ngoài ra, sử dụng PDO cho phép bạn viết các truy vấn của mình dưới dạng "Các câu lệnh đã chuẩn bị", ràng buộc các tham số thay vì mã hóa chúng thành một chuỗi truy vấn văn bản đơn giản. Điều này cũng có hàm ý bộ đệm trên máy chủ DB và đối với các truy vấn được lặp lại, cũng sẽ cải thiện hiệu suất.


2
"Kể từ MySQL 5.1.17, bộ đệm truy vấn được sử dụng cho các câu lệnh được chuẩn bị theo các điều kiện được mô tả trong Phần 8.6.3.1, Bộ đệm Cách truy vấn Bộ đệm truy vấn hoạt động. Trước 5.1.17, bộ đệm truy vấn không được sử dụng cho các câu lệnh đã chuẩn bị." dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" chung với tất cả các sản phẩm cơ sở dữ liệu phổ biến khác ": đó là một chút sai lệch. Hầu như bất kỳ DBMS nào tích cực lưu trữ kết quả truy vấn theo cách mà MySQL thực hiện. DBMS thường chỉ lưu trữ dữ liệu bảng (hoặc chỉ mục) , không phải kết quả truy vấn . Hầu hết trong số họ thực hiện lưu trữ kế hoạch truy vấn truy vấn (và "nguồn" truy vấn)
a_horse_with_no_name

3
"Nó thường có thể sử dụng bộ đệm cho truy vấn ngay cả khi các tham số chính xác của truy vấn không giống nhau" là hoàn toàn không chính xác. Truy vấn phải giống nhau theo từng byte với truy vấn được thực hiện trước đó và vẫn được lưu trong bộ nhớ cache để được cung cấp từ bộ đệm. Ngay cả sự khác biệt giữa SELECT *select *có nghĩa là một truy vấn giống hệt nhau sẽ không được cung cấp từ bộ đệm. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Đăng liên kết 5.1 để thống nhất, nhưng áp dụng cho tất cả các phiên bản.
Michael - sqlbot
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.