2010-05-03 33 views
18

Tôi có một bảng cho khoảng 100.000 người dùng trong đó.Hiệu suất xem MySQL

Trường hợp thứ nhất:

explain select state, count(*) as cnt from users where state = 'ca' 

Khi tôi làm một giải thích kế hoạch cho các truy vấn trên tôi nhận được chi phí như 5200

Thứ hai trường hợp:

Create or replace view vw_users as select state, count(*) as cnt from users 

Explain select cnt from vw_users where state = 'ca' 

Khi tôi làm một giải thích kế hoạch trên truy vấn thứ hai, tôi nhận được chi phí là 100.000.

Điều khoản where trong chế độ xem hoạt động như thế nào? Mệnh đề where có được áp dụng sau khi view xem tất cả các hàng không? Làm cách nào để khắc phục vấn đề này?

+2

định nghĩa khung nhìn của bạn là mất tích nhóm theo mệnh đề. –

+0

Nếu bạn không thể sử dụng thuật toán hợp nhất, đây là một công việc xung quanh tôi thấy hữu ích: [Giải pháp cho các vấn đề về hiệu suất của các chế độ xem dễ chịu] (http://www.mysqlperformanceblog.com/2010/05/19/a-workaround- for-the-performance-problems-of-temptable-views /) – landoncz

Trả lời

28

Đó là về số view algorithm đã được sử dụng.

Các merge thuật toán hoạt động tốt nhất chỉ số bảng và không có điều gì - các thuật toán temptable không - trong nhiều trường hợp chỉ số của bạn sẽ chỉ được phẳng ra không được sử dụng ở tất cả.

Và có rất nhiều crap mà hợp nhất không hỗ trợ

MERGE không thể được sử dụng nếu xem chứa bất kỳ cấu trúc sau:

* Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth) 
* DISTINCT 
* GROUP BY 
* HAVING 
* LIMIT 
* UNION or UNION ALL 
* Subquery in the select list 
* Refers only to literal values (in this case, there is no underlying table) 
+0

Peter, Cảm ơn bạn đã nhập. Tôi có một số (*) theo quan điểm của tôi. Vì vậy, tôi không thể sử dụng hợp nhất. Ngay bây giờ tôi đã không chỉ định bất kỳ loại thuật toán nào. Vì vậy, cách tốt nhất có thể sử dụng quy trình được lưu trữ thay vì chế độ xem? – vamsivanka

+0

Vâng, bạn sẽ phải thực hiện một thủ tục được lưu trữ tại đây - hoặc chỉ là truy vấn phụ thẳng lên. –

+0

Peter, Cảm ơn rất nhiều. – vamsivanka