2009-12-24 25 views
9

Tôi biết nói chung nó luôn luôn là hiệu suất tốt hơn để xây dựng các truy vấn mysql để đặt tên cho mỗi mục bạn cần nhưng ví dụ trên một trang hồ sơ tôi có thể cần tất cả các mục ngoại trừ một vài.Cách tốt nhất để sử dụng * khi gọi nhiều trường trong mysql?

SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit, 
user_role,photo_url,user_status,friend_count,comment_count,forum_post_count,referral_count,referral_count_total, 
setting_public_profile,setting_online,profile_purpose,profile_height,profile_body_type,profile_ethnicity, profile_occupation,profile_marital_status,profile_sex_orientation,profile_home_town,profile_religion, 
profile_smoker,profile_drinker,profile_kids,profile_education,profile_income,profile_headline,profile_about_me, 
profile_like_to_meet,profile_interest,profile_music,profile_television,profile_books,profile_heroes,profile_here_for,profile_counter FROM users WHERE user_id=1 AND user_role > 

Vì vậy, không thử nghiệm, có thể ai đó có nhiều kinh nghiệm hơn có thể kêu gọi một số lời khuyên?

này có thể tồi tệ hơn

SELECT * FROM users WHERE user_id=1 AND user_role > 

tôi thích để liệt kê tất cả các mục bởi vì khi đó trên trang đó nó chỉ là easiar để xem những gì tôi có sẵn cho tôi nếu tôi cần một cái gì đó từ DB nhưng nếu nó sẽ là nhanh hơn sau đó tôi sẽ không liệt kê chúng

Trả lời

14

Lưu ý: đặt tên cho tất cả các trường là khóa học tốt nhất, nhưng trong bài này tôi sẽ chỉ thảo luận về lợi ích hiệu suất chứ không phải thiết kế hoặc bảo trì.


Cú pháp * có thể chậm hơn vì những lý do sau đây:

  • Không phải tất cả các lĩnh vực được lập chỉ mục và truy vấn sử dụng đầy đủ bảng quét. Có lẽ không phải trường hợp của bạn: nó hầu như không thể là tất cả các trường bạn quay trở lại được lập chỉ mục với một chỉ mục duy nhất.

  • Trả lại các trường theo sau từ bảng có chứa cột có độ dài thay đổi có thể dẫn đến chi phí tìm kiếm nhỏ: để trả về trường 20th, trước đó cần kiểm tra và bù giá trị.

  • Chỉ cần trả lại nhiều dữ liệu hơn (thông qua kết nối).

Vì bạn cần gần như tất cả các trường, lý do cuối cùng có lẽ là quan trọng nhất. Giả sử, trường description TEXT chỉ có thể là 1 trong số 50 trường không được sử dụng trên trang nhưng có thể chiếm nhiều không gian như tất cả các trường khác cùng nhau.

Trong trường hợp này, dĩ nhiên là tốt hơn nên đặt tên cho tất cả các trường và bỏ qua các trường dài mà bạn không cần.

+1

Nhưng nếu bạn cần ** ALL ** các trường của bảng? –

+11

Sau đó, bạn nên chọn tất cả các khóa học. 'MySQL' sẽ mở rộng nội bộ' * 'vào danh sách đầy đủ các trường, sẽ không có sự khác biệt về hiệu suất. – Quassnoi

+0

@Quassnoi Về điểm đầu tiên của bạn, tôi không hoàn toàn hiểu cách biểu thức chọn, trong trường hợp của chúng tôi '*', có thể ảnh hưởng đến việc sử dụng chỉ mục. Như tôi đã hiểu, nếu điều kiện 'WHERE' hoạt động với một thuộc tính được lập chỉ mục thì chỉ mục tương ứng sẽ được sử dụng để tìm các bản ghi thỏa mãn điều kiện. Sau khi các bản ghi đã được định vị, RDBMS sẽ tải các thuộc tính được yêu cầu bởi biểu thức chọn. Từ quan điểm này, việc sử dụng chỉ mục không nên phụ thuộc vào một tập các thuộc tính đã nạp. –

2

Bạn nên luôn chỉ định các cột bạn cần, trừ khi ngôn ngữ lập trình của bạn hỗ trợ danh sách/mảng liên kết để tên có thể được truy xuất theo tên.

Nếu bạn cần truy xuất nó bằng số chỉ số, sau đó sử dụng * có thể đặt ra một vấn đề lớn sau này nếu bạn chèn một cột mới bất cứ nơi nào trong bảng, như tất cả các chỉ số từ thời điểm đó sẽ tăng một ...

3

Khi xem xét sử dụng *, bạn nên luôn xem xét khả năng có thêm nhiều trường sẽ được thêm vào bảng sau đó.

Nếu đó là nhiều trường khác, bạn có thể sẽ truy xuất và trả lại nhiều dữ liệu hơn mức bạn cần.

Bạn có thể gặp sự cố với một số trường mới. Ví dụ: nếu bạn chỉ lặp qua các trường và hiển thị chúng, bạn có thể có các trường mới mà bạn không muốn hiển thị. Hoặc kiểu dữ liệu có thể cần một số định dạng trước.

Cũng có khả năng trường sẽ bị xóa khỏi bảng, ví dụ như trong việc chuẩn hóa bảng. Mã mà dự kiến ​​một trường cụ thể có thể phá vỡ trong trường hợp đó.

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