2012-04-24 35 views
51

Nếu bạn đang đi xuống con đường sử dụng chế độ xem, bạn có thể đảm bảo hiệu suất tốt như thế nào?Hiệu suất xem MySql

Hoặc tốt hơn là không nên sử dụng chế độ xem ở địa điểm đầu tiên và chỉ kết hợp tương đương vào các câu lệnh chọn của bạn?

+5

Tôi đã tìm thấy [bài viết blog này] (http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/) bởi Peter Zaitsev khá nhiều thông tin trong quá khứ. – eggyal

+0

@eggyal - Cảm ơn, sẽ có một số đọc và suy nghĩ –

+0

Kiểm tra cũng gần đây ** [MariaDB 5.3] (http://kb.askmonty.org/en/what-is-mariadb-53) ** (và 5.5) các bản phát hành có một số cải tiến trên trình tối ưu hóa, bao gồm cả Chế độ xem. –

Trả lời

79

Tùy thuộc.

Nó hoàn toàn phụ thuộc vào những gì bạn đang xem thông qua chế độ xem. Nhưng hầu hết có thể giảm nỗ lực của bạn và cho hiệu suất cao hơn. Khi câu lệnh SQL tham chiếu một khung nhìn không được lập chỉ mục, trình phân tích cú pháp và trình tối ưu hóa truy vấn phân tích nguồn của cả câu lệnh SQL và khung nhìn và sau đó giải quyết chúng thành một kế hoạch thực thi duy nhất. Không có một kế hoạch cho câu lệnh SQL và một kế hoạch riêng cho khung nhìn.

Chế độ xem không được biên soạn. Một bảng ảo của nó được tạo thành từ các bảng khác. Khi bạn tạo nó, nó không nằm đâu đó trên máy chủ của bạn. Các truy vấn cơ bản tạo nên khung nhìn có cùng mức tăng hoặc hiệu suất của trình tối ưu hóa truy vấn. Tôi đã không bao giờ thử nghiệm hiệu suất trên một lần xem VS truy vấn cơ bản của nó, nhưng tôi sẽ tưởng tượng hiệu suất có thể thay đổi một chút. Bạn có thể nhận được hiệu suất tốt hơn trên chế độ xem được lập chỉ mục nếu dữ liệu tương đối tĩnh. Đây có thể là những gì bạn đang suy nghĩ có thể về "biên soạn".

Ưu điểm của quan điểm:

  1. Xem dữ liệu mà không lưu trữ các dữ liệu vào đối tượng.
  2. Khôi phục chế độ xem bảng, tức là có thể ẩn một số cột trong bảng.
  3. Tham gia hai hoặc nhiều bảng và hiển thị nó dưới dạng một đối tượng cho người dùng.
  4. Khôi phục quyền truy cập của bảng để không ai có thể chèn các hàng vào bảng.

Xem những liên kết hữu ích:

  1. Performance of VIEW vs. SQL statement
  2. Is a view faster than a simple query?
  3. Mysql VIEWS vs. PHP query
  4. Are MySql Views Dynamic and Efficient?
  5. Materialized View vs. Tables: What are the advantages?
  6. Is querying over a view slower than executing SQL directly?
  7. A workaround for the performance problems of TEMPTABLE views
  8. See performance gains by using indexed views in SQL Server
+1

Bạn đề cập đến các chế độ xem được lập chỉ mục và bạn có một số liên kết cho các bài viết được lập chỉ mục và vật hoá. Đây là tất cả tốt và tốt. Nhưng liệu MySQL có các khung nhìn được lập chỉ mục? –

+4

Hiện tại, MySQL không hỗ trợ chế độ xem được lập chỉ mục. –

+2

Câu trả lời hay. Tôi sẽ chỉ thêm vào nó rằng một khung nhìn về cơ bản là một truy vấn có tên trong MySQL. Nếu bạn đảm bảo rằng truy vấn tạo ra chế độ xem có hiệu suất tốt khi tự chạy, thì chế độ xem sẽ hoạt động tương tự. –

6

Tôi nghĩ blog của Peter Zaitsev có hầu hết các chi tiết. Nói từ quan điểm kinh nghiệm cá nhân có thể hoạt động tốt nếu bạn thường giữ chúng đơn giản. Tại một trong những khách hàng của tôi, họ đã tiếp tục xếp lớp một cái lên trên một cái khác và nó kết thúc trong một cơn ác mộng về sự hoàn hảo.

Nói chung tôi sử dụng chế độ xem để hiển thị một khía cạnh khác của bảng. Ví dụ trong bảng nhân viên của tôi cho tôi thấy các nhà quản lý hoặc ẩn trường tiền lương từ nhân viên không phải nhân sự. Cũng luôn đảm bảo rằng bạn chạy EXPLAIN trên truy vấn và xem để hiểu chính xác những gì đang xảy ra bên trong MySQL.

Nếu bạn muốn bằng chứng vững chắc trong trường hợp của mình, tôi khuyên bạn nên kiểm tra. Nó thực sự khó để nói bằng cách sử dụng quan điểm luôn luôn là một kẻ giết người hiệu suất sau đó một lần nữa một cái nhìn xấu bằng văn bản có lẽ sẽ giết hiệu suất của bạn.

3

Nếu chúng ta đang thảo luận "nếu bạn sử dụng chế độ xem, cách đảm bảo hiệu suất" và không ảnh hưởng hiệu suất của chế độ xem nói chung, tôi nghĩ rằng nó sẽ bị hạn chế (như chính bạn).

Bạn có thể gặp rắc rối lớn nếu bạn chỉ viết chế độ xem để làm cho truy vấn đơn giản trong mọi trường hợp, nhưng không quan tâm rằng lượt xem của bạn thực sự hiệu quả. Bất kỳ truy vấn nào bạn đang thực hiện cuối cùng đều phải chạy sane (xem ví dụ nhận xét từ liên kết đó bằng @eggyal). Ofcourse đó là một tautology, nhưng do đó không có bất kỳ ít có giá trị

Bạn đặc biệt cần phải cẩn thận không để làm cho quan điểm từ quan điểm, chỉ vì điều đó có thể làm cho nó dễ dàng hơn để làm cho rằng xem.

Cuối cùng, bạn cần xem lý do bạn đang sử dụng chế độ xem. Bất cứ lúc nào bạn làm điều này để làm cho cuộc sống dễ dàng hơn vào cuối chương trình, bạn có thể tốt hơn với một thủ tục lưu trữ IMHO.

Để giữ cho mọi thứ được kiểm soát, bạn có thể muốn viết ra lý do tại sao bạn có một chế độ xem nhất định và quyết định lý do bạn sử dụng nó. Đối với mỗi lần sử dụng 'mới' trong lập trình của bạn, hãy kiểm tra lại xem bạn có thực sự cần chế độ xem không, tại sao bạn cần nó và nếu điều này vẫn cung cấp cho bạn đường dẫn thực thi lành mạnh. Tiếp tục kiểm tra sử dụng của bạn để giữ cho nó nhanh chóng, và tiếp tục kiểm tra nếu bạn thực sự cần xem đó.

4

Dưới đây là tóm tắt tl; dr, bạn có thể tìm thấy các đánh giá chi tiết từ Peter Zaitsev và các nơi khác.

Chế độ xem trong MySQL thường là một ý tưởng tồi. Tại Grooveshark, chúng tôi coi chúng là có hại và luôn tránh chúng. Nếu bạn cẩn thận, bạn có thể làm cho họ làm việc nhưng tốt nhất họ là một cách để nhớ làm thế nào để chọn dữ liệu hoặc giữ cho bạn khỏi phải nhập lại các kết nối phức tạp. Tại tồi tệ nhất, chúng có thể gây ra sự thiếu hiệu quả lớn, ẩn sự phức tạp, gây ra các lựa chọn ngẫu nhiên lồng nhau (yêu cầu các bảng tạm thời và dẫn đến việc đập đĩa), v.v.

Tốt nhất là tránh chúng và giữ truy vấn của bạn bằng mã.

+1

Tôi ước tôi có thể thấy nhận xét này trước nhóm của mình và tôi đã đặt tất cả các chế độ xem đó với nhiều lần tham gia vào cơ sở dữ liệu sản xuất của chúng tôi:/ – Ralph

6

Chúng phục vụ cho mục đích của chúng, nhưng những phức tạp và không hiệu quả ẩn thường lớn hơn một cách tiếp cận trực tiếp hơn. Tôi đã từng gặp phải một câu lệnh SQL đã tham gia vào hai khung nhìn và phân loại chúng thành các kết quả. Các quan điểm cũng sắp xếp, vì vậy thời gian thực hiện có thể được đo bằng những gì có vẻ như giờ.

3

Một điều không được đề cập cho đến nay nhưng làm cho một sự khác biệt rất lớn là lập chỉ mục đầy đủ của quan điểm nguồn bảng.

Như đã đề cập ở trên, lượt xem không nằm trong DB nhưng được xây dựng lại mỗi lần. Vì vậy mọi thứ giúp việc xây dựng lại dễ dàng hơn cho DB làm tăng hiệu suất của khung nhìn.

Thông thường, lượt xem kết hợp dữ liệu theo cách rất xấu để lưu trữ (không có biểu mẫu bình thường) nhưng rất tốt để sử dụng thêm (phân tích, trình bày dữ liệu cho người dùng, ...) và kết hợp dữ liệu từ khác nhau những cái bàn.

Các cột có hoạt động được lập chỉ mục hay không tạo sự khác biệt lớn về hiệu suất của chế độ xem. Nếu các bảng và các cột có liên quan của chúng được lập chỉ mục đã truy cập chế độ xem không kết thúc việc tính toán lại các chỉ mục lặp đi lặp lại trước tiên.(mặt khác, điều này được thực hiện khi dữ liệu được thao tác trong các bảng nguồn)

! Lập chỉ mục tất cả các cột được sử dụng trong các mệnh đề JOINS và GROUP BY trong câu lệnh CREATE VIEW của bạn!