2009-09-05 17 views
7

Tôi đang cố gắng tối ưu hóa các truy vấn mysql của mình để tránh 'sử dụng tạm thời, sử dụng filesort'. Tôi có thể sự dùng một vài sự giúp đỡ. Đầu tiên; đây là giải thíchSử dụng tạm thời, sử dụng filesort một ý tưởng tồi trong mysql?

Đây là Query

select pf.*,m.login,m.avatar 
from profile_friends pf, members m 
where pf.friend_id = m.id and pf.member_id = 16586 
order by m.lastLogin desc 
limit 0,24; 


mysql> EXPLAIN select pf.*,m.login,m.avatar from profile_friends pf, members m where pf.friend_id = m.id and pf.member_id = 16586 order by m.lastLogin desc limit 0,24; 
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+ 
| id | select_type | table | type | possible_keys          | key    | key_len | ref      | rows | Extra          | 
+----+-------------+-------+--------+-----------------------------------------------------+-----------------+---------+--------------------------+------+----------------------------------------------+ 
| 1 | SIMPLE  | pf | ref | member_id_index,friend_id_index      | member_id_index |  4 | const     | 160 | Using where; Using temporary; Using filesort | 
| 1 | SIMPLE  | m  | eq_ref | PRIMARY,member_id_privacy_index,id_last_login_index | PRIMARY   |  4 | mydb.pf.friend_id  | 1 | Using where         | 

Có 2 bảng liên quan. ProfileFriends (pf) và Thành viên (m). Truy vấn này chỉ đang cố gắng tìm 24 bạn bè 'gần đây' cho id thành viên cụ thể này. Gần đây có nghĩa là sắp xếp theo ngày LastLogin.

Cảm ơn

Trả lời

17

Đó là vấn đề? Ừ.

Có vấn đề gì khi bạn đang xử lý 160 hàng không? Không.

"Tệp tin" là một phương pháp, không phải là việc tạo tệp thực tế và sắp xếp tệp. Nếu chúng ta đang nói về 160.000 hàng thay vì 160 hàng, thì có thể có lý do để xem xét tối ưu hóa thêm.

Chỉnh sửa: Ngoài ra, bạn đã bỏ qua thời gian chạy truy vấn thực tế. Bạn đang đánh chỉ mục và chỉ làm việc với một số hàng. Nếu truy vấn này chiếm nhiều hơn một phần nhỏ của một phần nhỏ của một giây, có thể nó không đáng để xem xét tối ưu hóa.

+3

+1 Có, cho 160 hàng MySQL thậm chí có thể giữ bảng tạm thời trong bộ nhớ, mà không cần ghi nó vào đĩa. "Filesort" là một chút gây hiểu nhầm, nó chỉ có nghĩa là nó sắp xếp mà không có lợi ích của một chỉ mục. –

1

Đó là cách hiệu quả nhất để viết truy vấn đó.

Đảm bảo rằng pf.friend_id, pf.member_idm.id có chỉ mục trên chúng. Sau đó, nó sẽ sử dụng các chỉ số để tham gia các bảng và lọc kết quả.

Sắp xếp sắp ra mắt, bởi vì order by của bạn.

+4

MySQL sẽ sử dụng chỉ mục trên 'pf.friend_id' hoặc chỉ mục trên' pf.member_id' nhưng nó sẽ không sử dụng cả hai, do đó không cần tạo chỉ mục thừa. Nó có thể sử dụng một chỉ mục trên '(member_id, friend_id)' mặc dù. –

2

Tôi nghĩ rằng bạn sẽ có thể để tránh tạm thời/filesort với một chỉ mục trên members (id,lastLogin)— theo thứ tự mà — nhưng cho loại truy vấn nó quá mức cần thiết và xét xử của bạn GIẢI THÍCH có vẻ như bạn đã cố gắng đó?

Bạn có thể bổ sung nó bằng phím CHÍNH/UNIQUE trên profile_friends (member_id,friend_id) và xem cách hoạt động. Trong lần cuối cùng, nếu truy vấn đó được thực hiện thường xuyên và với quá nhiều bản ghi mà bạn phải có SELECT nhanh nhất có thể, bạn có thể làm chuẩn hóa bảng của bạn và thêm một bản sao của cột members.lastLogin của bạn vào profile_friends với chỉ mục trên (member_id,lastLogin). Với điều đó, bạn không có tham gia, không có filesort, không có gì. Mặt khác, bạn sẽ có các truy vấn UPDATE lớn mọi lúc mọi người có nhiều bạn bè đăng nhập. Một lần nữa, điều này có vẻ hoàn toàn quá mức cần thiết đối với loại số bạn đang nói đến.

Tôi gần như quên để giải quyết các câu hỏi ban đầu:

Sử dụng tạm thời, sử dụng filesort một ý tưởng tồi trong mysql?

Không. Nếu bạn có thể tối ưu hóa nó một cách dễ dàng thì bạn nên luôn tìm kiếm các truy vấn "không có tệp", nhưng nếu không, trừ khi chúng đặt ra một vấn đề hiệu năng thực sự, bạn không nên lo lắng về nó. Filesort là một phần của việc thực hiện bình thường của một truy vấn.

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