6.1 Giriş
Şimdi teoriden pratiğe geçelim.
Gerçek dünyada yaşıyoruz ve tüm yazılım ürünleri nihayetinde yaşayan insanlar için yaratılmıştır. Ve bu yaşayan insanlar, yavaş yüklenen sitelerden ve yavaşlayan programlardan çok rahatsız oluyor.
Ve bir veritabanı sorgusu bir saniyeden uzun sürerse, bu kabul edilemez . Kullanıcılar, çok yavaş sayfaları/işlevleri olan bir ürünü kullanmazlar.
Ancak genellikle, bir sayfayı görüntülemek için veritabanında birkaç düzine sorgu gerçekleştirmeniz gerekir. Ve sırayla yürütülürlerse, artık ikinci bir sınırınız olmaz, ancak istek başına 100 ms diyelim.
Programcıların veritabanı sorgularını hızlandırmanın en iyi 5 yolu şunlardır:
- Veritabanındaki tablolara indeks ekleme.
- Sorguları yeniden yazma ve optimize etme.
- Veritabanı tarafında önbelleğe almayı etkinleştirin (ve yapılandırın).
- İstemci tarafında önbelleğe almayı etkinleştirin.
- Veritabanı denormalizasyonu gerçekleştiriliyor.
Tüm bu şeylere zaten büyük ölçüde aşinasınız, bu nedenle aşağıdakiler yalnızca pratik tavsiyeler olacaktır.
6.2 Endeksler
Bir veritabanıyla çalışmanın hemen hemen her sitenin işinin çoğunu aldığı bir sır değil. Ve çoğu zaman web uygulamalarının darboğazı olan veritabanıyla çalışıyor.
Bu yazıda MySQL kullanımıyla ilgili pratik tavsiyeler vermek istiyorum.
Hemen söyleyeceğim:
- genel şeyler muhtemelen herhangi bir DBMS için doğru olsa da, bu makale MySQL hakkında yazılmıştır.
- Makalede yazılan her şey benim kişisel bakış açımdır ve nihai gerçek değildir.
- tavsiye yeniymiş gibi davranmaz ve okunan literatürün ve kişisel deneyimin genelleştirilmesinin sonucudur.
- bu yazı çerçevesinde MySQL yapılandırma konularına değinmeyeceğim.
MySQL kullanırken karşılaşılan sorunlar aşağıdaki üç gruba ayrılabilir (önem sırasına göre):
- Dizinlerin kullanılmaması veya kötüye kullanılması.
- Yanlış veritabanı yapısı.
- Yanlış \ yetersiz SQL sorguları.
Bu grupların her birine daha yakından bakalım.
Dizinleri Kullanma
Dizinleri kullanmamak veya kötüye kullanmak, sorguları en çok yavaşlatan şeydir. İndekslerin nasıl çalıştığına dair mekanizmaya aşina olmayan veya kılavuzda henüz okumamış olanlar için, onu okumanızı şiddetle tavsiye ederim.
İndeksleri kullanmak için ipuçları:
- Her şeyi indekslemenize gerek yok . Çoğu zaman, insanlar anlamını anlamadan bir tablonun tüm alanlarını dizine ekler. Dizinler getirmeleri hızlandırır, ancak satır eklemeleri ve güncellemeleri yavaşlatır, bu nedenle her bir dizinin seçimi anlamlı olmalıdır.
- Dizini karakterize eden ana parametrelerden biri, dizindeki farklı öğelerin sayısı olan seçiciliktir. İki veya üç olası değeri olan bir alanı dizine eklemenin bir anlamı yoktur. Böyle bir endeksten çok az fayda olacaktır.
- İndeks seçimi, belirli bir tabloya göre tüm sorguların analizi ile başlamalıdır. Çoğu zaman, böyle bir analizden sonra, üç veya dört endeks yerine, bir bileşik endeks yapabilirsiniz.
- Bileşik dizinler kullanılırken, dizindeki alanların sırası çok önemlidir.
- Dizinleri kapatmayı unutmayın. Bir sorgudaki tüm veriler bir dizinden alınabilirse, MySQL tabloya doğrudan erişemez. Bu tür istekler çok hızlı bir şekilde yerine getirilecektir. Örneğin,
SELECT name FROM user WHERE login='test'dizine (oturum açma adı, ad) sahip bir sorgu için tabloya erişim gerekli değildir. Bazen bileşik bir dizine ek bir alan eklemek mantıklıdır, bu da dizini kaplayacak ve sorguları hızlandıracaktır.
- Satır indeksleri için, genellikle satırın sadece bir kısmını indekslemek yeterlidir. Bu, dizin boyutunu önemli ölçüde azaltabilir.
%Başlangıçta ise, dizinler
LIKE(SELECT * FROM table WHERE field LIKE '%test')kullanılmayacaktır.
- FULLTEXT dizini yalnızca MATCH ... AGAINST söz dizimi ile kullanılır .
6.3 Veritabanı yapısı
İyi tasarlanmış bir veritabanı, veritabanıyla hızlı ve verimli çalışmanın anahtarıdır. Öte yandan, kötü tasarlanmış bir veritabanı, geliştiriciler için her zaman bir baş ağrısıdır.
Veritabanı tasarım ipuçları:
- Mümkün olan en küçük veri türlerini kullanın. Veri türü ne kadar büyükse, tablo o kadar büyük olur ve verileri almak için o kadar fazla disk erişimi gerekir. Çok uygun bir prosedür kullanın:
SELECT * FROM table_name PROCEDURE ANALYSE();olası minimum veri türlerini belirlemek için.
- Tasarım aşamasında normal formları gözlemleyin. Genellikle programcılar zaten bu aşamada denormalizasyona başvururlar. Ancak çoğu durumda, projenin başlangıcında bunun nasıl sonuçlanabileceği açık olmaktan çok uzaktır. Bir tabloyu denormalize etmek, optimalin altında denormalize edilmiş bir tablodan muzdarip olmaktan çok daha kolaydır. Ve
JOINbazen yanlış şekilde denormalize edilmiş tablolardan daha hızlı çalışır.
NULLBilinçli olarak ihtiyacınız olmadıkça sütunları kullanmayın .
6.4 SQL sorguları.
Çoğu zaman, sorgunun olabildiğince hızlı olması için tüm sorguları yerel SQL'de yeniden yazma isteği vardır. Bunu yapmaya karar verirseniz, işte bazı ipuçları:
- Bir döngüdeki isteklerden kaçının. SQL bir kümeler dilidir ve yazma sorgularına işlevlerin dilinde değil, kümelerin dilinde yaklaşılmalıdır.
*Sorgularda (yıldız) kullanmaktan kaçının . Tam olarak seçtiğiniz alanları listelemekten çekinmeyin. Bu, getirilen ve gönderilen veri miktarını azaltacaktır. Ayrıca, dizinleri kaplamayı da unutmayın. Tablodaki tüm alanları seçseniz bile listelemek daha iyidir. Birincisi , kodun okunabilirliğini artırır. Yıldız işaretlerini kullanırken, tabloya bakmadan hangi alanların olduğunu bulmak imkansızdır. İkincisi , bugün tablonuzda beş INT sütunu var ve bir ay sonra bir TEXT ve BLOB daha eklendi ve yıldız işareti olduğu gibi kaldı.
- Sayfalandırıldığında, toplam kayıt sayısını almak için
SQL_CALC_FOUND_ROWSve
SELECT FOUND_ROWS();Kullanıldığında öğesini kullanın
SQL_CALC_FOUND_ROWS MySQL, seçilen satır sayısını (LIMIT uygulanmadan önce) önbelleğe alır ve kullanıldığında,
SELECT FOUND_ROWS()sorguyu yeniden yürütmek zorunda kalmadan yalnızca bu önbelleğe alınmış değeri döndürür.
- Birden fazla ekleme için bir sözdizimi olduğunu unutmayın
INSERT. Bir sorgu, bir döngüdeki birden çok sorgudan çok daha hızlı çalışır.
LIMITTüm verilere ihtiyaç duymadığınız yerlerde kullanın .
INSERT… ON DUPLICATE KEY UPDATE…Seçimin yerine ve
INSERTveya
UPDATEsonrasında ve genellikle yerine kullanın
REPLACE.
- Bu harika özelliği unutmayın
GROUP_CONCAT. Karmaşık sorgularda yardımcı olabilir.