SEÇME Sorgusu * Kullanımı [yinelenen]

6 Cevap php

Possible Duplicate:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.

Şu anda MySQL5 ve PHP5 MySQL3 ve PHP4 yazılmış bir uygulamayı taşıma duyuyorum.

Analizi Ben sadece bir sütun (alan) PHP işlenmiş olsa bile "tabloismi seçin *" kullanan birkaç SQL sorguları bulundu. Tablo neredeyse 60 sütun vardır ve bir birincil anahtarı vardır. Çoğu durumda, kullanılan tek sütun birincil anahtar id budur.

Ben sütun adları açıkça söz yerine * hangi sorgular kullanırsanız, herhangi bir performans artışı olacak mı? (Bu uygulamada tüm sütunlar ve diğer tüm yöntemler bölümlerinden sadece bir alt kümesini döndürür gereken tek bir yöntem var)

6 Cevap

Bu genellikle sadece gerekli olanı almak için iyi bir uygulama olarak kabul edilir. Tüketen makineye ağ üzerinden taşımak için daha fazla veri olduğundan veritabanı sunucusu tüm bir satır getiriliyor, aynı makine üzerinde değil, özellikle eğer, yavaş sorguları neden olacaktır. Tam bir satır veri 100k gibi ve siz sadece çok az kimliği gerekirse Yani, tabii ki daha hızlı sonuç alırsınız.

Sorguları optimize etmek için genel bir ipucu olarak, bir sorgu nasıl olacak pahalı görmek için EXPLAIN statement kullanın.

"Prematüre optimizasyonu tüm kötülüklerin köküdür." Donald Knuth.

Will there be any performance boost? gibi bir soru sormaz. "Ben bazı darboğaz. Nasıl bunu ortadan kaldırabilir mi?" Gibi ama sadece bir soru sormak

Bizim uygulamalar% 99, bu "gelişme" irrlelvant olacaktır. dreams dayalı olarak diğer birçok iyileştirmeler, değil profiling ve gerçek ihtiyaçları üzerine.

Eğer yarar varsa ve ne kadar durum bağlıdır, ama sadece id sütununu gerektiğinde en az durumlarda, size SQL düzeltmek gerekir.

(Gereksiz veri gönderme) azaltılmış ağ trafiğine ek olarak, veritabanı tüm tablo erişmeden, sadece indeksleri kullanılarak gerek yok birkaç sütun almak mümkün olabilir. Bu bir çok şeyi hızlandırmak olacaktır.

Sadece olası olumsuz sunucu işlemek vardır (ve ucunda daha karmaşık kodu) o ayrı SQL tabloların artan sayısıdır.

Hayır - performansı üzerinde bir etkisi olacaktır ama (300 baud modem üzerinden veritabanına erişmek sürece) sürece bLOBs / CLOBs şemada yok gibi önemsiz olacak - veritabanı tarafından yapılan çalışmanın en olduğunu WHERE yan tümcesi eşleşen satırları belirlenmesi - onun (IMHO) kötü programlama uygulama SEÇ kullanmak ancak *

C.

Evet. Vb MySQL ve PHP, arasında gönderilen diskten okumak gerektiği zaman gereken daha fazla veri getiriliyor ediyorsanız muhtemelen daha uzun sürecekse edilmektedir.

Ayrıca ben veritabanı ilk sorguyu yapmadan önce almak için gidiyor sütunları bakmak gerekiyor çünkü SELECT * kötü zamanlar ben bir yerde okumuştum, ama ben bu konuda yanlış olabilir.

Evet. İstediğiniz sadece sütunları getir. Bu performansı artırabilir, ancak yanlışlıkla kırma kodunuzu önlemek olmaz. Bu sorguyu düşünün:

SELECT * FROM tabA JOIN tabB on ... ORDER BY colX

Onlar sadece TABA colX olduğunda bugün çalışmalarını sorgulamak, ama şemasını değiştirmek ve tabb, sorgu irade abend colX eklerseniz.

Elbette tüm alanlar için tablo diğer adları kullanarak da kırılmayı önlemeye yardımcı olacaktır.

-Krip