2013-05-22 30 views
14

Tôi cực kỳ mới với Chế độ xem vì vậy hãy tha thứ cho tôi nếu đây là câu hỏi ngớ ngẩn, nhưng tôi có Chế độ xem thực sự hữu ích trong việc tối ưu hóa truy vấn khá khó sử dụng và cho phép tôi chọn một nhóm nhỏ các cột trong Chế độ xem tuy nhiên, tôi đã hy vọng rằng Chế độ xem thực sự sẽ được lưu trữ ở đâu đó để lựa chọn chống lại nó sẽ không mất nhiều thời gian.Có cách nào để lưu vào bộ nhớ cache Chế độ xem để truy vấn nhanh chóng không?

Tôi có thể bị nhầm lẫn, nhưng tôi hiểu được (từ tốc độ create view thực hiện và từ thời gian truy vấn của tôi đối với Chế độ xem của tôi) rằng Chế độ xem thực sự chạy dưới dạng truy vấn trước truy vấn bên ngoài, mọi lúc Tôi chọn chống lại nó. Tôi thực sự hy vọng rằng tôi đang xem xét một số cơ chế nhờ đó khi tôi chạy CREATE VIEW, nó có thể thực hiện công việc khó khăn khi truy vấn truy vấn Xem *, để lựa chọn tiếp theo của tôi chống lại Chế độ xem tĩnh này sẽ thực sự nhanh chóng.

BTW, tôi hoàn toàn hiểu rằng rõ ràng VIEW này sẽ là ảnh chụp nhanh dữ liệu đã tồn tại tại thời điểm VIEW được tạo và sẽ không phản ánh bất kỳ thông tin mới nào được chèn/cập nhật sau khi tạo VIEW. Đó thực sự là những gì tôi cần.

TIA

+0

Vì vậy, những gì bạn muốn là chế độ xem vật hoá, không phải dạng xem mysql cung cấp mà chỉ là bí danh cho truy vấn lớn. Theo mysql 5.1, các truy vấn SELECT đối với khung nhìn được lưu trữ, do đó mọi truy vấn tiếp theo sẽ nhanh chóng. Làm thế nào chính xác là một cái gì đó không làm việc cho bạn ở đây? Bạn có sử dụng truy vấn con trong truy vấn tạo chế độ xem không? –

+0

Tôi đang sử dụng truy vấn lớn với nhiều mục chọn trong VIEW của mình và dường như không phải là bộ nhớ đệm. Như một bằng chứng về khái niệm tôi chỉ đơn giản gọi là 'select count (id) từ myView' mà tôi đoán là khá linh hoạt nếu kết quả của myView được lưu trữ, nhưng nó chỉ mất chừng nào bất kỳ truy vấn nào khác chống lại nó. Có phải vấn đề mà Chế độ xem của tôi đã chọn không? (Tôi không chắc chắn đó là những gì bạn có ý nghĩa của subqueries hoặc nếu có một sự khác biệt). –

+0

Chọn lựa hoặc truy vấn phụ - vì vậy chúng tôi đang nói về cùng một điều. MySQL sử dụng bộ nhớ cache truy vấn riêng của nó.Nói, chúng ta có một bảng với 1 mil hàng, bạn truy vấn nó như 'select count (*)' - lần đầu tiên sẽ là slow-ish, lần thứ hai sẽ tức thời vì nó sẽ lấy dữ liệu được lưu trữ. Cùng một quy tắc áp dụng cho các khung nhìn, với sự khác biệt mà MySQL không lưu trữ các kết quả bỏ chọn. Tất cả điều này có nghĩa là kết quả bạn nhận được từ chế độ xem của bạn * sẽ không được lưu vào bộ nhớ cache nội bộ * bởi MySQL nếu bạn có các lựa chọn. Do đó, nó sẽ luôn chạy các truy vấn từ đầu, nếu bạn muốn. Và đó là lý do tại sao chế độ xem của bạn sẽ chậm. –

Trả lời

12

Điều bạn muốn làm là hiển thị chế độ xem của bạn. Hãy xem http://www.fromdual.com/mysql-materialized-views.

+0

hmm ... cũng dựa trên hướng dẫn đó có vẻ như trong quan điểm mySQL Materializing là một chút của một summersault. Tôi đã hy vọng rằng nó sẽ đơn giản như thêm một số từ khóa để tạo ra khung nhìn của tôi. Oh well ... cảm ơn vì đã cho tôi biết nó được gọi là gì! :) –

+0

@ Dr.Dredel: bạn luôn có thể chuyển sang DB2 nơi một con thú như vậy _is_ có thể chỉ bằng cách thêm một từ duy nhất. Bạn có thể không xem xét các chi phí có giá trị tuy nhiên :-) – paxdiablo

+0

thật đáng buồn đó không phải là một lựa chọn cho chúng tôi tại thời điểm này :) –

2

Những gì bạn đang nói đến là quan điểm vật chất hóa, một tính năng của (ít nhất) DB2 nhưng không phải MySQL như xa như tôi biết. Có một số cách để mô phỏng bằng cách tạo/điền bảng theo định kỳ hoặc theo yêu cầu, nhưng chế độ xem vật hoá thực sự biết khi nào dữ liệu cơ bản đã thay đổi và chỉ tính toán lại nếu được yêu cầu.

Nếu dữ liệu sẽ không bao giờ thay đổi khi chế độ xem được tạo (như bạn cho biết trong nhận xét), chỉ cần tạo bảng mới để giữ tập hợp con dữ liệu và truy vấn . Mọi người luôn phàn nàn về tốc độ chậm nhưng hiếm khi có yêu cầu lưu trữ dữ liệu :-)

+0

trớ trêu thay, tôi thực sự không muốn bảng * được lưu trong bộ nhớ cache thay đổi. Tôi đang làm các công cụ như 'select * trong đó ngày giữa x và y' như vậy, bảng được lưu trong bộ nhớ cache của tôi đại diện cho một tập hợp dữ liệu cố định sẽ không dịch chuyển chút nào. Tôi chỉ muốn có thể nhanh chóng lựa chọn dữ liệu đó. –

0

Vì chế độ xem cơ bản là tuyên bố SELECT bạn có thể sử dụng query cache để cải thiện hiệu suất.

Nhưng trước tiên bạn nên kiểm tra xem:

  • bạn có thể thêm các chỉ số trong các bảng tham gia để tăng tốc độ truy vấn (sử dụng EXPLAIN)
  • dữ liệu không được thay đổi rất thường xuyên, bạn có thể hóa quan điểm (tạo ảnh chụp nhanh)
Các vấn đề liên quan