Ai đó có thể giải thích lý do tại sao việc tham gia hai lượt xem trong mysql lại chậm như vậy không?


7

Đây là một câu hỏi tôi đã hỏi ngày hôm qua - /programming/22180727/left-joining-two-view-is-slow .

Tôi đã nhận được một câu trả lời hay giúp tôi nhưng tôi không hiểu tại sao TRÁI PHIẾU chậm hơn nhiều so với việc tra cứu. THAM GIA TRÁI PHIẾU là 16 giây - và tôi khá chắc chắn rằng các bảng của tôi được tối ưu hóa ít nhất 90% - và khi thực hiện tra cứu, nó chỉ là 0,14 giây. Khi tôi THAM GIA bảng, nó không chậm như vậy, tại sao lại xem?


Làm thế nào là các bảng bên dưới các khung nhìn được lập chỉ mục? Các cột bạn đang tham gia TRÁI PHIẾU có các chỉ mục hữu ích cho việc tham gia này không?
RLF

@RLF - Có hai trường uid và trid được sử dụng cho tất cả các phép nối và cả hai trường được lập chỉ mục trên tất cả các bảng của chúng. Tôi có thể tạo các bảng trong số các chế độ xem và TRÁI PHIẾU giống như 1,5 giây.
LOSTinDB

Câu trả lời:


10

Theo Tài liệu MySQL về Lượt xem

Lượt xem (bao gồm cả lượt xem cập nhật) có sẵn trong MySQL Server 5.6. Lượt xem là các truy vấn được lưu trữ mà khi được gọi sẽ tạo ra một tập kết quả. Một khung nhìn hoạt động như một bảng ảo.

Điều đầu tiên phải nhận ra về một khung nhìn là nó tạo ra một tập kết quả. Tập kết quả nổi lên từ truy vấn được gọi từ chế độ xem là một bảng ảo vì nó được tạo theo yêu cầu. Không có DDL bạn có thể triệu tập sau đó để lập chỉ mục ngay lập tức cho tập kết quả. Đối với tất cả ý định và mục đích, tập kết quả là một bảng không có bất kỳ chỉ mục nào. Trên thực tế, LEFT THAM GIA mà bạn đang thực hiện về cơ bản là một sản phẩm của Cartesian với một số bộ lọc.

Để cung cấp cho bạn cái nhìn chi tiết hơn về THAM GIA của hai chế độ xem, tôi sẽ đề cập đến bài đăng tôi đã thực hiện năm ngoái giải thích các cơ chế nội bộ mà MySQL sử dụng để đánh giá THAM GIA và WHERE ( Có sự khác biệt thực thi giữa điều kiện THAM GIA và điều kiện WHERE không? ). Tôi sẽ chỉ cho bạn cơ chế như được xuất bản trong Tìm hiểu về Nội bộ MySQL (Trang 172):

  • Xác định khóa nào có thể được sử dụng để truy xuất các bản ghi từ các bảng và chọn khóa tốt nhất cho mỗi bảng.
  • Đối với mỗi bảng, hãy quyết định xem quét bảng có tốt hơn không khi đọc trên khóa. Nếu có nhiều bản ghi khớp với giá trị khóa, các ưu điểm của khóa sẽ giảm và quá trình quét bảng trở nên nhanh hơn.
  • Xác định thứ tự các bảng sẽ được nối khi có nhiều hơn một bảng trong truy vấn.
  • Viết lại các mệnh đề WHERE để loại bỏ mã chết, giảm các tính toán không cần thiết và thay đổi các ràng buộc bất cứ nơi nào có thể để mở đường cho việc sử dụng các khóa.
  • Loại bỏ các bảng không sử dụng từ tham gia.
  • Xác định xem các phím có thể được sử dụng cho ORDER BYGROUP BY.
  • Cố gắng đơn giản hóa các truy vấn con, cũng như xác định mức độ kết quả của chúng có thể được lưu trữ.
  • Hợp nhất các khung nhìn (mở rộng tham chiếu khung nhìn dưới dạng macro)

OK, có vẻ như các chỉ mục nên được sử dụng. Tuy nhiên, nhìn kỹ hơn. Nếu bạn thay thế từ Viewcho Table, hãy xem điều gì xảy ra với sự thực thi của cơ chế:

CƠ CHẾ SỬA ĐỔI

  • Xác định khóa nào có thể được sử dụng để truy xuất các bản ghi từ đó viewsvà chọn khóa tốt nhất cho từng bản ghi view.
  • Đối với mỗi view, hãy quyết định xem việc viewquét trên phím có tốt hơn không. Nếu có nhiều bản ghi khớp với giá trị khóa, các ưu điểm của khóa sẽ giảm và quá viewtrình quét trở nên nhanh hơn.
  • Xác định thứ tự viewssẽ được nối khi có nhiều hơn một viewstrong truy vấn.
  • Viết lại các mệnh đề WHERE để loại bỏ mã chết, giảm các tính toán không cần thiết và thay đổi các ràng buộc bất cứ nơi nào có thể để mở đường cho việc sử dụng các khóa.
  • Loại bỏ không sử dụng viewstừ tham gia.
  • Xác định xem các phím có thể được sử dụng cho ORDER BYGROUP BY.
  • Cố gắng đơn giản hóa các truy vấn con, cũng như xác định mức độ kết quả của chúng có thể được lưu trữ.
  • Hợp nhất các khung nhìn (mở rộng tham chiếu khung nhìn dưới dạng macro)

Mỗi bảng (xem) không có chỉ mục. Do đó, làm việc với các bảng ảo, bảng tạm thời hoặc các bảng không có chỉ mục thực sự trở nên không rõ ràng khi thực hiện THAM GIA. Các khóa được sử dụng chỉ dành cho các hoạt động THAM GIA, không quá nhiều để tìm kiếm mọi thứ nhanh hơn.

Hãy nghĩ về truy vấn của bạn khi chọn hai danh bạ điện thoại, Trang vàng 2014 và Trang vàng 2013. Mỗi cuốn sách Những trang vàng chứa các trang trắng cho số điện thoại dân cư.

  • Vào cuối năm 2012, một bảng cơ sở dữ liệu đã được sử dụng để tạo ra các trang vàng 2013.
  • Trong năm 2013
    • Người đổi số điện thoại
    • Người nhận được số điện thoại mới
    • Mọi người bỏ số điện thoại, chuyển sang điện thoại di động
  • Vào cuối năm 2013, một bảng cơ sở dữ liệu đã được sử dụng để tạo Trang Vàng 2014.

Rõ ràng, có sự khác biệt giữa hai Danh bạ điện thoại. Thực hiện THAM GIA các bảng cơ sở dữ liệu để tìm ra sự khác biệt giữa năm 2013 và 2014 sẽ không gây ra vấn đề gì.

Hãy tưởng tượng hợp nhất hai danh bạ điện thoại bằng tay để xác định vị trí khác biệt. Nghe có vẻ điên rồ phải không? Mặc dù vậy, đó chính xác là những gì bạn đang yêu cầu mysqld làm khi bạn tham gia hai chế độ xem. Hãy nhớ rằng, bạn không tham gia các bảng thực và không có chỉ mục để cõng từ đó.

Bây giờ, hãy nhìn lại truy vấn thực tế.

SELECT DISTINCT
viewA.TRID, 
viewA.hits,
viewA.department,
viewA.admin,
viewA.publisher,
viewA.employee,
viewA.logincount,
viewA.registrationdate,
viewA.firstlogin,
viewA.lastlogin,
viewA.`month`,
viewA.`year`,
viewA.businesscategory,
viewA.mail,
viewA.givenname,
viewA.sn,
viewA.departmentnumber,
viewA.sa_title,
viewA.title,
viewA.supemail,
viewA.regionname
FROM
viewA
LEFT JOIN viewB ON viewA.TRID = viewB.TRID
WHERE viewB.TRID IS NULL 

Bạn đang sử dụng một bảng ảo (bảng không có chỉ mục), viewA, nối nó với một bảng ảo khác, viewB. Bảng tạm thời được tạo ra không liên tục sẽ lớn như viewA. Sau đó, bạn chạy một sắp xếp nội bộ trên bảng tạm thời lớn để làm cho nó khác biệt.

TIẾNG VIỆT

Với các cơ chế nội bộ của việc đánh giá THAM GIA, cùng với tính chất nhất thời và không chỉ mục của tập kết quả của một chế độ xem, truy vấn ban đầu của bạn (TRÁI PHIẾU hai chế độ xem) sẽ có được thời gian chạy theo thứ tự độ lớn. Đồng thời, câu trả lời bạn nhận được từ StackOverflow sẽ hoạt động tốt, được đưa ra cùng thuật toán THAM GIA mà tôi vừa mô tả.

Tôi hy vọng các chi tiết tin đồn tôi vừa đăng câu trả lời câu hỏi của bạn là tại sao.


Tôi biết bạn đã sao chép "Chế độ xem (bao gồm các chế độ xem có thể cập nhật) có sẵn trong MySQL Server 5.6" từ tài liệu chính thức nhưng có vẻ như các chế độ xem được giới thiệu trong 5.6 trong khi chúng có sẵn từ phiên bản 5.0.
ypercubeᵀᴹ

Tôi đọc rằng các khung nhìn sử dụng các chỉ mục gốc từ các bảng chỉ không cho phép tạo một chỉ mục mới trên các trường của nó. Nếu tôi truy vấn chế độ xem trên Chọn * Từ chế độ xem TRID = 10, nó sẽ sử dụng chỉ mục gốc, phải không?
Bergkamp

1

EXPLAIN EXTENDED [select query]và sau đó SHOW WARNINGSsẽ hiển thị dạng viết lại của khung nhìn. Từ đây, dễ dàng hơn để phân tích các đặc tính hiệu suất.

Truy vấn kiểm tra tầm nhìn thường không dễ dàng để tối ưu hóa.


Tôi hiểu cả hai chiến thuật này nhưng điều đó có trả lời được câu hỏi không?
LOSTinDB

1
Nó có thể :) Để diễn giải: bất kỳ câu trả lời là suy đoán mà không có thông tin này.
Morgan Tocker

-2

Câu trả lời liên quan đến phương pháp thực hiện từng thao tác này.

Do các chế độ xem vốn không được lập trình, các hoạt động THAM GIA sử dụng các trường từ các chế độ xem sẽ mất nhiều thời gian hơn các hoạt động THAM GIA bằng cách sử dụng các bảng do quá trình quét không thể sử dụng một chỉ mục.

Trong trường hợp này, việc tra cứu cũng giới hạn số lượng hồ sơ phải được trả lại khi xử lý - nó chỉ kéo các bản ghi từ một chế độ xem không tồn tại ở chế độ khác. THAM GIA kéo tất cả các bản ghi và sau đó kiểm tra xem các bản ghi có tồn tại trong cả hai không.


1
Điều này có nghĩa là MySQL không thể sử dụng các chỉ mục trên bảng bên dưới khi truy vấn một khung nhìn?
a_horse_with_no_name

1
@a_horse_with_no_name không, không. Câu trả lời này là không chính xác trong vấn đề đó. Nếu MERGEthuật toán có thể được sử dụng để xử lý khung nhìn, các chỉ mục trên các bảng bên dưới có thể và sẽ được sử dụng. Chỉ khi định nghĩa chế độ xem sử dụng rõ ràng TEMPTABLEthuật toán hoặc chế độ xem chứa chức năng hoàn toàn yêu cầu bảng tạm thời, thì kết quả chế độ xem sẽ được cụ thể hóa thành bảng tạm thời. dev.mysql.com/doc/refman/5.6/en/view-alerskyms.html
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.