2012-11-27 27 views
7

Tôi có truy vấn sau đâyLàm cách nào để cải thiện hiệu suất của COUNT (DISTINCT field1) ... GROUP BY field2?

EXPLAIN SELECT COUNT(DISTINCT ip_address) as ip_address, exec_date 
    FROM requests 
    GROUP BY exec_date; 

id select_type table  type  possible_keys key   key_len ref  rows Extra 
1 SIMPLE  requests range  NULL   daily_ips 263  NULL 488213 Using index for group-by (scanning) 

Với chỉ số bao phủ daily_ips

Table  Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment 
requests 1   daily_ips 1    exec_date A   16   NULL  NULL YES BTREE  
requests 1   daily_ips 2    ip_address A   483492  NULL  NULL YES BTREE  

Có cách nào tôi có thể tiếp tục tối ưu hóa truy vấn này?

Chính xác thì Using index for group-by (scanning) có nghĩa là gì? Điều đó có nghĩa là toàn bộ mệnh đề GROUP BY được thực hiện hoàn toàn từ một chỉ mục trong khi phần COUNT(DISTINCT ip_address) của tuyên bố không?

Trả lời

3

Dựa trên dữ liệu bạn đã cung cấp, tôi không thấy bất kỳ cách nào bạn có thể tối ưu hóa thêm truy vấn.

Như để theo dõi câu hỏi của bạn, trang hướng dẫn của MySQL mô tả giải thích đầu ra cho Using index for group-by nói:

Tương tự như các Sử dụng phương pháp truy cập bảng chỉ mục, Sử dụng chỉ số cho nhóm bằng cách chỉ ra rằng MySQL tìm thấy một danh mục có thể được sử dụng để truy xuất tất cả các cột của truy vấn GROUP BY hoặc DISTINCT mà không cần thêm bất kỳ truy cập đĩa nào vào bảng thực tế. Ngoài ra, chỉ mục được sử dụng theo cách hiệu quả nhất để cho mỗi nhóm, chỉ một vài mục chỉ mục được đọc. Để biết chi tiết, hãy xem Section 8.13.10, “GROUP BY Optimization”.

Chỉ mục của bạn đặc biệt phù hợp để tăng tốc truy vấn của bạn. Bởi vì chỉ có các trường được lập chỉ mục được chọn (mỗi cột trong truy vấn của bạn cũng xuất hiện trong chỉ mục), MySQL có thể thậm chí không cần phải nhấn vào bảng, vì tất cả các dữ liệu có liên quan xuất hiện trong chỉ mục.

Nếu thực hiện truy vấn giống như thực hiện tìm kiếm trên google, hãy tưởng tượng không phải nhấp qua bất kỳ trang web được liên kết nào, vì bạn tìm thấy thông tin bạn đang tìm kiếm trực tiếp trong kết quả tìm kiếm - cần phải quét dữ liệu bảng như thế nào. Dưới đây là một số chi tiết thông tin về how MySQL uses indexes:

Trong một số trường hợp, một truy vấn có thể được tối ưu hóa để lấy giá trị mà không cần tham khảo ý kiến ​​các hàng dữ liệu. Nếu một truy vấn chỉ sử dụng các cột từ một bảng có dạng số và tạo thành một tiền tố ngoài cùng bên trái cho một số khóa, thì các giá trị đã chọn có thể được lấy ra từ cây chỉ mục. cho tốc độ cao hơn:

CHỌNkey_part3TỪtbl_nameĐÂUkey_part1 = 1

+1

Cảm ơn Danny, vì tò mò có cách nào tôi có thể biết liệu 'Sử dụng chỉ mục cho nhóm theo (quét)' có nghĩa là chỉ mục được áp dụng cho mệnh đề 'GROUP-BY' hoặc' DISTINCT' không? – user784637

+0

Vì 'DISTINCT' chỉ là [trường hợp đặc biệt của' GROUP BY'] (http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html), và vì cả hai cột đều xuất phát từ cùng một bảng, cùng một chỉ mục, tôi thành thật không chắc chắn. –

0

Bạn bạn có thể là Objectify:

Objectify ofy = ObjectifyService.begin(); Truy vấn truy vấn = ofy.query (đây là tên lớp.class) .filter ("tên cột trong bảng", giá trị để truy vấn) .list();

Trước đó bạn có thể cần phải thêm bình cho Objectify.

Các vấn đề liên quan