- 1. Adlandırma kuralı
- 2. Daima doğru veri türünü kullanın
- 3. VARCHAR (1) yerine CHAR (1) kullanın
- 4. Sabit veriler için CHAR
- 5. Bölgesel tarih biçimlerini kullanmaktan kaçının
- 6. Önbellek için isteklerinizi optimize edin
- 7. Sorgularınızda "SELECT *" kullanmaktan kaçının
- 8. LIMIT 1 kullanın Yalnızca tek bir satır istediğinizde
- 9. ***** BY kullanımı
- 10. Uygun temel motoru seçin
- 11. Gerektiğinde EXISTS yan tümcesini kullanın
- 12. SELECT sorgularınızda EXPLAIN kullanın
- 13. Dizin oluşturun ve Birleştirmeler için aynı sütun türünü kullanın
- 14. Yapabiliyorsanız NULL DEĞİL kullanın
- 15. Sabit boyutlu tablolar (Statik) daha hızlıdır
- 16. Dikey Bölümleme
- 17. IP adreslerini UNSIGNED INT olarak saklar
- 18. Tablolarda ortak kullanımı basitleştirmek için Görünümler oluşturun
- 19. ***** BY RAND () kullanmayın
- 20. WHERE yan tümcesini optimize edin
MySQL veritabanı, yüksek performansı, tutarlılığı, yüksek güvenilirliği ve kullanım kolaylığı nedeniyle dünyanın en popüler açık kaynaklı ilişkisel veritabanı haline geldi. Ancak bize sunduğu bu faydalar, genellikle üzerinde çalışma şeklimizden etkilenir.
Bu eğitimde, çok faydalı olacak ve hem programcı hem de veritabanı yöneticisi açısından en iyi şekilde yararlanmamızı sağlayacak bir dizi ipucu öğreneceksiniz.
Hangi aracı kullanacağız?MySQL komut konsolu '] MySQL, veritabanını komut satırı ile yönetmek için kullanılan veritabanı (mysql) ile aynı ada sahip bir programa sahiptir.
pencerelerAşağıdaki gibi bir dizinde bulunur:
C: \ Program Dosyaları \ MySQL \ MySQL Sunucusu 5.6 \ bin
Dizin değişebilir, örneğin C: diskinin kökünde veya MySQL'i kurmuş olabileceğimiz herhangi bir yerde bulunabilir. Windows'ta MySQL konsoluna erişmek için bu dizinde bulunmamız gerekecek.
LinuxAşağıdaki bağlantıya bakın:
MySQL'e Linux'tan erişin
MacSistemli bilgisayarlar Mac OS X mevcut uygulamalar arasında yerleşik komut satırı terminaline sahiptirler. Erişmek için aynı komut Linux'ta olduğu gibi kullanılır.
phpMyAdminMySQL'i İnternet üzerinden yönetmek için kullanılan, PHP ile yazılmış ücretsiz bir yazılım aracıdır. XAMPP veya WAMP gibi kurulu bir yerel geliştirme ortamınız varsa, bu araç zaten kurulu olacaktır. Yönetim panelli bir barındırma planınız varsa, çoğu bu aracı MySQL veritabanı yöneticisi olarak sunar.
[renk = rgb (169.169.169)] XAMPP'den phpMyAdmin [/ color]
BÜYÜT
[color = # a9a9a9] CPanel'den phpMyAdmin [/ color]
Bu 2 aracı elimizde bulundurarak, aşağıda gösterdiğimiz tüm bu iyi uygulamaları test etmeye başlayabiliriz.
Bunlar En İyi 20 MySQL En İyi Uygulaması:
1. Adlandırma kuralı
Her programlama dili için kodlama standartları vardır, ancak MySQL açısından herkesin takip ettiği evrensel kodlama uygulamaları bulamadık. Bununla birlikte, PHP tabanlı birkaç açık kaynak çerçevesini gözden geçirerek, SQL sorgularını daha hızlı yazmamıza yardımcı olacak, hem sorguda hem de kullandığımız programlama dilinde karışıklığı ve çakışmaları ortadan kaldıracak bazı genel uygulama kurallarını filtreliyoruz.
Genel kurallarSorunlardan kaçınmak için aşağıdaki kuralları aklınızda bulundurun.
- Küçük harf kullanmanız yazma hızınızda size yardımcı olacağı için küçük harf ve büyük harfe duyarlı işlevler vb. durumlarda hataları önleyecektir.
- Boşluk kullanmayın, bunun yerine alt çizgi (_) kullanın.
- İsimlerde rakam kullanmayın, sadece İngilizce alfabetik karakterler kullanın.
- Geçerli, anlaşılır adlar kullanın.
- İsimler açıklayıcı olmalıdır.
- Adlar 64 karakterden fazla olmamalıdır.
- Ön ek kullanmaktan kaçının.
Veritabanı adları için kurallarYukarıdaki tüm genel kurallara uyun.
- Ad hem tekil hem de çoğul olabilir, ancak veritabanı bir veritabanını temsil eder, bu nedenle mümkün olduğunca tekil olmalıdır.
- Mümkünse öneklerden kaçının.
Tablo adları için kurallarTablo adları için küçük harf kullanın: MySQL genellikle Linux sunucularında barındırılır, büyük/küçük harf duyarlıdır, bu nedenle en iyi uygulama tablo adlarını küçük harf kullanmaktır.
- Tabloların adları tekil olmalıdır: tablo, modelde olduğu gibi tek bir varlıktır, bu nedenle tablonun adının çoğul olması gariptir.
- Tablo adındaki önekler: Tabloların önüne veritabanı adı veya proje adı eklendiğini birçok kez gördük. Bazen bu, projemizde bazı barındırma sağlayıcılarının sınırlamalarının üstesinden gelmek için birçok veritabanımız olduğunda gereklidir. Ancak gerekli değilse ve projemiz küçükse önek kullanmaktan kaçının.
Alanların adıYukarıdaki tüm kuralları kullanın, yani küçük harf kullanın, boşluk kullanmayın, sayı kullanmayın ve öneklerden kaçının.
- Mümkünse bir veya iki kısa kelime kullanın.
- Alan adları anlaşılabilir olmalıdır, örneğin: fiyat, şirket_adı, vb.
- Birincil sütun adı: Birincil anahtarın kimlik adı veya _id tablo adı olabilir. Bu seçime bağlı olacaktır.
- Şu alanlarda ayrılmış kelimeler kullanmaktan kaçının: *****, tarih, vb. Bu durumlarda kayıt_tarihi gibi öneklerin kullanılması tercih edilir.
- Aynı tablo adına sahip sütun adlarını kullanmaktan kaçının. Bu, sorgularınızı yazarken karışıklığa neden olabilir.
- Kısaltılmış veya birleştirilmiş kısaltmalardaki adlardan kaçının.
2. Daima doğru veri türünü kullanın
Verilerin doğasına göre veri türlerini kullanın. Alakasız veri türlerinin kullanılması daha fazla yer kaplayabilir veya hatalara yol açabilir.
ÖrnekDATETIME yerine varchar (20) kullanmak, tarihle ilgili saat hesaplamaları sırasında hatalara neden olabilir ve geçersiz veri depolama durumunda da mümkündür.
3. VARCHAR (1) yerine CHAR (1) kullanın
Tek bir karakter dizisi sakladıysanız, CHAR (1) kullan VARCHAR (1) yerine, çünkü VARCHAR (1) bilgileri depolamak için fazladan bir bayt alacaktır. Bu karakterleri yönetirken dikkate alınması gerekenler.
4. Sabit veriler için CHAR
Yalnızca sabit uzunluktaki verileri depolamak için CHAR verilerini kullanın
Örnek:
VARCHAR (1000) yerine CHAR (1000) kullanılması, verilerin uzunluğu 1000'den azsa daha fazla alan tüketir.
5. Bölgesel tarih biçimlerini kullanmaktan kaçının
Veri türlerini kullanırken:
- DATETIME
- TARİH
Her zaman SQL motorunuza uygun YYYY-AA-GG biçimini veya ISO tarih biçimini kullanın. GG-AA-YYY, GG-AA-YYYY gibi diğer bölgesel biçimler doğru şekilde saklanmayacaktır.
6. Önbellek için isteklerinizi optimize edin
çoğu MySQL sunucularında önbellek sistemi etkin. Veritabanı motorunun elinden gelen performansı artırmanın en etkili yöntemlerinden biridir. Aynı istek birden çok kez yürütüldüğünde, sonuç önbellekten alınır ve bu çok daha hızlıdır.
Aşağıdaki örnek PHP'de:
// Önbellek ÇALIŞMAZ $ r = mysql_query ("Kullanıcılardan NEREDE kayıt seç> = CURDATE ()");
// Önbellek ÇALIŞIYOR $ bugün = tarih ("Y-m-d"); $ r = mysql_query ("NEREDE kullanıcılardan isim SEÇİN kayıt> = '$ bugün'");İlk durumda çalışmamasının nedeni CURDATE () kullanılmasıdır. NOW() ve RAND() gibi tüm deterministik olmayan fonksiyonlara uygulanabilir. İşlev tarafından döndürülen sonuç değişebileceğinden, MySQL bu sorgudaki önbelleği devre dışı bırakmaya karar verir.
7. Sorgularınızda "SELECT *" kullanmaktan kaçının
Genel bir kural olarak, tablolardan ne kadar çok veri okunursa, sorgu o kadar yavaş yapılır. Bazı üretim tablolarının, bazıları büyük veri türlerinden oluşan düzinelerce sütun içerebileceğini düşünürsek, hepsini seçmek akıllıca olmaz.
Bu iyi bir alışkanlık SELECT ifadenizde gerekli sütunları belirtin.
8. LIMIT 1 kullanın Yalnızca tek bir satır istediğinizde
Bazen tablolarınızı sorgularken tek bir satıra ihtiyacınız olduğunu bilirsiniz. Bu durumlarda, veritabanından tek bir sonuç talep etmelisiniz, aksi takdirde WHERE yan tümcesindeki eşleşmelerin her birini kontrol edecektir.
Bu durumlarda, sorgunuza LIMIT 1 eklemek, hızı önemli ölçüde artırabilir. Bu şekilde veritabanı, tüm tabloyu veya bir dizini gözden geçirmek yerine sonuçları bulduğu anda taramayı durduracaktır.
// Madrid'den kullanıcılarım var mı? // NE YAPILMAMALI: $ r = mysql_query ("SELECT * FROM user WHERE city =' Madrid '"); if (mysql_num_rows ($ r)> 0) {//…} // çok daha iyi: $ r = mysql_query ("NEREDE kullanıcıdan 1 SEÇİN şehir =' Madrid 'LIMIT 1"); if (mysql_num_rows ($ r)> 0) {//…}[renk = # a9a9a9]LIMIT tavsiyesi[/Renk]
9. ***** BY kullanımı
Kullanımı ***** TARAFINDAN çok kullanıcılı ortamlarda yanıt süresini yavaşlatabilir. Bu nedenle, ***** BY yan tümcesinin yalnızca gerektiğinde kullanılmasını öneririz.
Kullanımını kötüye kullanmayın.
10. Uygun temel motoru seçin
Verileri yazmaktan daha sık okuyan bir uygulama geliştirirseniz.
(örneğin: arama motoru), MyISAM depolama motorunu seçin.
Verileri okumaktan daha sık yazan bir uygulama geliştirirseniz
(örneğin: gerçek zamanlı bankacılık), InnoDB depolama motorunu seçin.
Yanlış depolama motorunu seçmek, sorgularınızın performansını etkiler.
11. Gerektiğinde EXISTS yan tümcesini kullanın
Verileri kontrol etmek istiyorsanız şunları kullanmayın:
If (SELECT count (*) from Table WHERE col = 'bir değer')> 0Bunun yerine EXISTS yan tümcesini kullanın:
VARSA (SELECT * WHERE tablosundan sütun = 'bir değer')Tepki süresinde hangisi daha hızlıdır.
12. SELECT sorgularınızda EXPLAIN kullanın
EXPLAIN anahtar sözcüğünü kullanmak, MySQL'in sorgunuzu yürütmek için ne yaptığına dair size birçok dahili ayrıntı verecektir. Bu, sorgunuz veya tablo yapınızla ilgili darboğazları ve diğer sorunları tespit etmenize yardımcı olabilir.
EXPLAIN sorgusunun sonucu, kullanılan dizinleri, tablonun nasıl araştırıldığını, nasıl sıralandığını vb. gösterecektir.
Bir SELECT sorgusu seçin (tercihen birleşimleri olan karmaşık bir sorgu) ve her şeyin başına EXPLAIN kelimesini ekleyin. Sonuçları basit bir tabloda döndürür. Örneğin, bir sütunu dizine eklemeyi unuttuğumu varsayalım, bize aşağıdaki ekranı gösterecektir:
BÜYÜT
Dizini durum tablosuna ekledikten sonra şöyle görünür:
BÜYÜT
13. Dizin oluşturun ve Birleştirmeler için aynı sütun türünü kullanın
Uygulamanız çok sayıda JOIN ifadesi içeriyorsa, katıldığınız sütunların her iki tabloda da indekslendiğinden emin olmalısınız. Bu nasıl etkiler MySQL dahili olarak optimize eder JOIN işlemleri.
Ayrıca, katıldığınız sütunlar aynı türde olmalıdır. Örneğin, DECIMAL türünde bir sütunu başka bir tablodan INT türünde bir sütunla birleştiriyorsanız, MySQL iki dizinden en az birini kullanamaz. Sütunlar için karakter kodlamasının bile aynı türde olması gerekir. dize türü.
// şehrimdeki şirketleri arıyorum $ r = mysql_query ("kullanıcılardan şirket_adı SEÇİN SOL şirketias ON (users.city = companyias.city) WHERE users.id = $ user_id");Her iki şehir sütunu da dizine eklenmeli ve her ikisi de aynı türde ve karakter kodlamasında olmalıdır, aksi takdirde MySQL'in tabloların tam taramasını yapması gerekir.
14. Yapabiliyorsanız NULL DEĞİL kullanın
NULL değerini kullanmak için belirli bir nedeniniz yoksa, sütunlarınızı her zaman NOT NULL olarak ayarlamalısınız.
Her şeyden önce, boş bir dizeye sahip olmak ile NULL değere sahip olmak (veya INT alanları için: 0 ile NULL) arasında bir fark olup olmadığını kendinize sorun. İki değer arasında sorun yoksa NULL alanına ihtiyacınız yoktur. NULL sütunlar ek alan gerektirir ve karşılaştırma ifadelerinize karmaşıklık katabilir. Sadece mümkün olduğunda onlardan kaçının.
Her durumda, bazı çok özel durumlarda, her zaman kötü bir şey olmayan NULL sütunları kullanmanın bir nedeni olduğunu anlıyoruz.
15. Sabit boyutlu tablolar (Statik) daha hızlıdır
Bir tablodaki her sütun sabit uzunlukta olduğunda, tüm tablo "statik" veya "sabit uzunluklu" olarak kabul edilir.
Sabit boyutta OLMAYAN bazı sütun türleri şunlardır:
- VARCHAR
- METİN
- BLOB
Bu sütun türlerinden yalnızca birini eklerseniz, tablo artık sabit boyutta olmayacak ve MySQL motoru.
MySQL motorunun kayıtlarınızı araması daha hızlı olduğu için, sabit boyutlu tablolar üretkenliği artırabilir. Tabloda belirli bir satırı okumak istediğinizde, konumunu hızlı bir şekilde hesaplayabilirsiniz. Satır boyutu sabit değilse, her arama yapmanız gerektiğinde, önce birincil anahtarın dizinini sorgulamanız gerekir.
Ayrıca arama yapmak ve bir kazadan sonra yeniden inşa etmek daha kolaydır. Ancak diğer yandan daha fazla yer kaplayabilirler.
16. Dikey Bölümleme
Dikey bölümleme, optimizasyon nedenleriyle tablo yapınızı dikey olarak ayırma eylemidir.
Örnek 1:
Çok sık kullanılmayan bir posta adresi içeren bir kullanıcı tablonuz mutlaka olacaktır. Burada tabloyu bölebilir ve adresleri ayrı bir tabloda saklayabilirsiniz. Bu şekilde ana kullanıcı tablonuz daha dar bir boyuta sahip olacaktır. Bildiğiniz gibi, tablolar ne kadar küçük olursa o kadar hızlı olur.
Örnek 2:
Tablonuzda bir "last_access" alanınız var. Bir kullanıcı sayfanıza her eriştiğinde güncellenir. Ancak her erişim, o tablonun sorgu önbelleğinin serbest bırakılmasına neden olur. Yapabileceğiniz şey, bu alanı başka bir tabloya koymak, böylece kullanıcı tablonuzdaki değişiklikleri minimumda tutmak.
Ancak, bölümlemeden sonra sürekli olarak iki tabloyu birleştirmeniz gerekmediğinden emin olmalısınız, aksi takdirde aradığımızın tam tersi bir performans düşüşü yaşarsınız.
17. IP adreslerini UNSIGNED INT olarak saklar
Birçok programcı bir VARCHAR alanı (15) IP adreslerini tam sayılar olarak saklayabileceklerinin farkında olmadan. Bir INT kullandığınızda, bellekte yalnızca 4 bayt kullanırsınız ve ayrıca tabloda sabit bir boyutu vardır.
Ama emin olmalısınız ki, sütun İMZASIZ INT (işaretsiz tamsayı) çünkü IP adresleri 32 bitlik işaretsiz aralığın tamamını kullanır.
Sorgularınızda kullanabilirsiniz INET_ATON () işlevi bir IP adresini bir tamsayıya dönüştürmek için ve INET_NTOA () tersini yapmak için. PHP'de adı verilen benzer işlevler de vardır. ip2uzun () Y uzun2ip ().
18. Tablolarda ortak kullanımı basitleştirmek için Görünümler oluşturun
Görünümler, hem karmaşık şemaları hem de güvenlik uygulamasını basitleştirmeye yardımcı olur. Güvenlik kısmına katkıda bulunmalarının bir yolu, alanların adlarını geliştiricilerden gizlemenize izin vermesidir.
Ayrıca, yalnızca aramada daha hızlı görüntülenen alanları bırakarak, dizine eklenmemiş sütunları filtrelemek için kullanılabilir.
19. ***** BY RAND () kullanmayın
Bu, ilk bakışta kulağa harika gelen ve birçok acemi programcının düşme eğiliminde olduğu numaralardan biridir. İsteklerinizde bu tekniği kullanmanın neden olabileceği inanılmaz darboğazı fark etmemiş olabilirsiniz.
Sonucunuz için gerçekten rastgele tablolara ihtiyacınız varsa, bunu yapmanın çok daha iyi yolları vardır. Daha fazla kod alacakları açıktır, ancak içeriğiniz büyüdükçe katlanarak artan olası bir darboğazı önlemiş olacaksınız.
Sorun şu ki MySQL'in çalışması gerekecek RANDEVU () (işlem gücü gerektirir) sıralamadan ve tek bir satır döndürmeden önce satırların her biri için.
// bunu YAPMAMANIN yolu: $ r = mysql_query ("Kullanıcı adını SEÇ ***** RAND BY () LIMIT 1"); // çok daha iyi: $ r = mysql_query ("kullanıcıdan sayı SEÇ (*)"); $ d = mysql_fetch_row ($ r); $ rand = mt_rand (0, $ d [0] - 1); $ r = mysql_query ("Kullanıcı adı LIMIT $ rand, 1'DEN SEÇ kullanıcı adı");Böylece, sonuç sayısından daha az rastgele bir sayı seçersiniz ve bunu LIMIT yan tümcesinde ofset olarak kullanırsınız.
20. WHERE yan tümcesini optimize edin
bunlar bazıları WHERE yan tümcesini optimize etmek için ipuçları:
- Gereksiz parantezleri kaldırın. Örneğin:
KİMDEN: (5 VE b = c VE a = 5
- SAYMAK (*) bir tabloya olduğu sürece ve WHERE'ı kullanmadan bir SELECT'i çok daha hızlı döndürmek için optimize edilmiştir. Örneğin:
Tablodan SAYI (*) SEÇİN.
- NS SQL_SMALL_RESULT seçeneği, ile kullanılabilir GRUP TARAFINDAN veya BELİRGİN sonuç kümesinin küçük olduğunu belirtmek için. Bu durumda MySQL, sıralama kullanmak yerine ortaya çıkan tabloyu depolamak için çok hızlı geçici tablolar kullanır.
MySQL öğreticileri