2009-12-24 21 views
9

Genelde ihtiyaç duyduğunuz her öğeyi adlandırabilmek için mysql sorguları oluşturmak için her zaman daha iyi bir performans olduğunu biliyorum, ancak bir profil sayfasındaki birkaç öğenin dışında her bir öğeye ihtiyacım olabilir.Mysql'de çok fazla alan ararken * kullanılması en iyi yöntem nedir?

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 > 

Bu yüzden, bir sürü test yapmadan, belki daha fazla deneyime sahip biri, bazı tavsiyelere başvurabilir mi? o olurdu

bu ben ardından bu sayfadaki ben DB'den bir şey gerekiyorsa bana elimizde ne var sadece easiar çünkü tüm öğeleri listelemek için tercih

SELECT * FROM users WHERE user_id=1 AND user_role > 

kötü olabilir ama misiniz daha hızlı o zaman onları listelemedim.

cevap

14

Not: tüm alanların isimlendirilmesi elbette ki en iyi uygulamadır, ancak bu yazıda sadece performans avantajlarını değil tasarım veya bakım olanları tartışacağım.


* sözdizimi aşağıdaki nedenlerle yavaş olabilir:

  • tüm alanları endekslidir değil ve sorgu tam tablo taraması kullanır. Muhtemelen sizin durumunuz değil: Geri döndüğünüz tüm alanların tek bir endeksle endekslenmesi neredeyse imkansız. değişken uzunlukta sütun hafif arama yükü neden olabilir içeren bir tablodan

  • dönersek sondaki alanları: 20th alanını dönmek için, önceki 19 incelenmelidir ve uzaklıklar hesaplanmaktadır.

  • Sadece daha fazla veri döndürülmelidir (bağlantı üzerinden geçirilir).

Neredeyse tüm alanlara gereksiniminiz olduğundan, son neden muhtemelen en önemli olanıdır. Say, description TEXT alanı, sayfadaki kullanılmayan 50 alanlarının yalnızca 1 alanları olabilir, ancak diğer tüm alanlar ile birlikte 10 kat fazla yer kaplayabilir.

Bu durumda, tüm alanları adlandırmak ve ihtiyacınız olmayan uzun alanları atlamak elbette daha iyi olacaktır.

+1

Peki ya tabana ** ALL ** ihtiyacınız varsa? –

+11

Sonra hepsini seçmelisiniz. 'MySQL' '' 'alanların tam listesine dahili olarak genişleyecektir, hiçbir performans farkı olmayacaktır. – Quassnoi

+0

@Quassnoi İlk noktanıza baktığımızda, seçtiğimiz bir ifadenin '*' durumumuzda dizin kullanımını nasıl etkileyeceğini tam olarak anlayamıyorum. Anladığım kadarıyla, "WHERE" koşulu, indekslenmiş bir öznitelikle çalışıyorsa, durumu karşılayan kayıtları bulmak için karşılık gelen dizin kullanılacaktır. Kayıtlar yerleştirildikten sonra RDBMS, select ifadesinin gerektirdiği özellikleri yükleyecektir. Bu bakış açısından, dizin kullanımı bir dizi yüklenmiş özniteliğe bağlı olmamalıdır. –

2

Programlama diliniz ilişkilendirilebilir listeleri/dizileri desteklemediğinden, adların yeniden adlandırabilmesi için gereken sütunları her zaman belirtmelisiniz.

o noktadan itibaren tüm endeksler birer artacak gibi, tablodaki herhangi yeni bir sütun eklerseniz daha sonra büyük bir problem teşkil edebilir * kullanarak sonra, indeks sayısına göre retreive gerekirse ...

3

* Kullanmayı düşündüğünüzde, daha sonra tabloya daha fazla alan ekleneceğini düşünmelisiniz.

Çok daha fazla alan varsa, ihtiyacınız olandan daha fazla veri almak ve döndürmekle sonuçlanabilir.

Bazı yeni alanlarla ilgili bir sorun olabilir. Örneğin, yalnızca alanları gezip görüntülerseniz, görüntülemek istemediğiniz yeni alanlarınız olabilir. Veya veri türü önce bazı biçimlendirmeye ihtiyaç duyabilir.Tabloyu normalleştirme gibi bir alanın tablodan çıkarılması ihtimali de vardır. Belirli bir alanın beklediği kod bu durumda kırılabilir.

İlgili konular