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 BY
và GROUP 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ừ View
cho 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ừ đó
views
và 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 view
qué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á view
trình quét trở nên nhanh hơn.
- Xác định thứ tự
views
sẽ được nối khi có nhiều hơn một views
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ỏ không sử dụng
views
từ tham gia.
- Xác định xem các phím có thể được sử dụng cho
ORDER BY
và GROUP 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.