Bu makalede, daha iyi performans için MySql kullanırken aklınızda bulundurmanız gereken birkaç şeyi göreceğiz.
MySQL : Çoklu iş parçacıklı, çok kullanıcılı, hızlı ve sağlam bir veri tabanı yönetim sistemidir. Bu sisteme giriş yaptığınızı ve ilk tablo veya şemalarınızı oluşturmaya başladığınızı düşünüyorum. Şimdi bu aşamadan sonra performans-kural odaklı MySQL projelerinizi nasıl bir tık daha ileriye götürebileceğinizi inceleyelim.
Schema (Şema) tasarlarken akılda tutulması gerekenler:
MySql, çeşitli veri türlerini destekler, ancak her alana yalnızca VARCHAR veya TEXT yapmak yerine, ihtiyacınıza daha uygun olanı her zaman seçmelisiniz xP
Tam Sayı: Tamsayı değerini depolamak için çeşitli türler vardır ve her birinin int içinde saklanabilen kendi değer aralığı vardır.
- TINYINT: 8 bit
- SMALLINT: 16 bit
- ORTA NOKTA: 24bit
- INT: 32bit
- BÜYÜK: 64bit
Her tür -2 ^ (n-1) ile 2 ^ (n-1) -1 arasındaki değerleri depolayabilir , bu nedenle akıllıca seçim yapmak daha iyidir çünkü her tür, değerleri depolamak için farklı miktarda alan alır.
Negatif değer olmadığından oldukça eminseniz , aynı boşlukla aralığı iki katına 0'dan 2 * (2 ^ n-1) ' e çıkarmak için aslında UNSIGNED'ı kullanabilirsiniz .
İlginç Bilgi : MySql, int boyutunun 8 bitten daha azını tanımlamamıza izin verir, bu int (1) gibi bir şey, ancak dahili olarak 1 bit yerine normal int olarak yer kaplar , bu MySQL istemci seviyesi kontrolüdür.
Gerçek Sayı (FLOAT - DECIMAL): FLOAT 32bit ve DECIMAL 64bit alan kapladığından, gerçekten kesin kesirli değerlere ihtiyaç duyana kadar kesirli değerleri depolamak için mümkün olduğunca FLOAT kullanmalısınız.
Kesin kesirli noktaları gerçekten önemsediğinizde DECIMAL kullanmalısınız.
Dize: MySql'de oldukça benzer görünen ancak birçok farklılığa sahip başlıca iki veri türü vardır.
- VARCHAR: VARCHAR, alan açısından sabit uzunluklu türden daha verimlidir çünkü yalnızca ihtiyaç duyduğu kadar alanı kullanır, eğer VARCHAR'ı (20) tanımladıysanız bu, her satır için her zaman 20 bayt alacağı anlamına gelmez, Boşluğu satırda depolanan değere göre kullanır, örneğin 10 bayt uzunluğunda bir dizi depoluyorsanız, 10 baytlık alan alır, bu nedenle 20'nin bir dizenin sahip olabileceği maksimum uzunluk olduğu açıktır.
VARCHAR aslında değişken alan nedeniyle alan açısından performansı iyileştirir, ancak bazen önceden depolanmış değerden daha büyük bir uzunluğa sahip değeri güncellediğimizde parçalanma sorununa yol açar, bu nedenle MySQL, alanı bu satıra yeniden tahsis etmek zorunda kalır ve parçalanma.
- CHAR: CHAR'ı yalnızca, sabit uzunlukta veya neredeyse benzer uzunlukta saklanacak değerlerden oldukça emin olduğunuzda kullanmalısınız çünkü VARCHAR'dan farklı olarak CHAR her zaman sabit bir alanı kaplayacaktır.
Örneğin CHAR (20) 'yi tanımladıysanız, hangi uzunlukta dizeyi depolayacağınızdan bağımsız olarak her satır için her zaman 20 bayt alan alacaktır.
İlginç Gerçek: VARCHAR, dizenin uzunluğunu depolamak için şema oluşturmada tanımlanan boyuttan çok birkaç ekstra bayt alır, örneğin VARCHAR (100) tanımladıysanız, o zaman VARCHAR (1000) için 1 ekstra bayt, 2 bayt alacak dizenin uzunluğu da, CHAR her zaman CHAR (100) gibi tam boşluk miktarını alırken 100 bayt fazladan boşluk bırakmaz.
BINARY vs VARBINARY: ikili dizeleri depolarken, VARCHAR yerine BINARY veya VARBINARY kullanmalısınız çünkü bellekteki her şey, bu nedenle ikili karşılaştırmalar karakter karşılaştırmalarından daha hızlıdır.
BLOB ve METİN: Bunları yalnızca büyük miktarda ikili dizeyi veya karakter dizesini sırasıyla saklamanız gerektiğinde kullanmalısınız.
DATETIME vs TIMESTAMP: TIMESTAMP'ı olabildiğince kullanmalısınız çünkü TIMESTAMP 4 bayt alırken DATETIME 8 bayt alan alır. DATETIME, 1001 ila 9999 yıl arasındaki değerleri tutabilirken, TIMESTAMP 1970 ila 2038 yıl arasındaki değerleri tutabilir.
İlginç gerçek:
Eklerken TIMESTAMP sütununun değerini belirtmezseniz, otomatik olarak geçerli zaman damgasına ayarlanır.
0 - sütunu TIMESTAMP olarak tanımlarsanız, depolanan değer şuna benzer 1969–12–31 19:00:00
MySql Dizinleri
İndeksler, büyük miktarda veriden verileri olabildiğince hızlı bulmak için MySQL sorgularının aranmasını iyileştirmek için kullanılır, MySQL'in çeşitli indeks türleri vardır, her birinin ne zaman kullanılacağına karar veren kendi özellikleri vardır.
B-Tree İndeksleri : B-Tree indeksleri MySql'de en yaygın indekslerdir, B-Tree aslında bilgileri sırayla saklar, bu yüzden B-Tree indeksi oluştururken sütunların sırasını dikkatlice seçmek zorunludur. Bilgi, aramayı oldukça hızlı hale getiren bir sırada depolandığından, çoğu sorgu verileri aynı sırada getirirken.
Aşağıdaki tabloya sahip olduğumuz gibi, bu şekilde anlayabilirsiniz:
CREATE TABLE People ( name varchar(50) not null, dob date not null, gender enum(‘m’, ‘f’)not null, key(name));
Artık tüm kayıt cihazları ad sütununa göre sıralı olarak saklanıyor, bu nedenle adı Alex ile başlayan tüm kişileri aramak oldukça hızlı .
Bunu ne zaman kullanmalı:
- Önek Eşleştirme: Kayıtlar sırayla saklandığından, adı verilen önekle başlayan tüm kişiler gibi önek aramak daha verimli olur .
- Aralık Değeri: Alex'ten Kim'e kadar tüm insanlar gibi, aralıktaki kayıtları aramanız gerektiğinde .
- Sıralama Ölçütü: Sorgularınız çoğunlukla ORDER BY kullandığında , dizin bunu verimli kılar çünkü kayıtlar zaten sırayla saklanır.
Oluştururken akılda tutulması gerekenler:
- Sütun Sırası: Sütun sırası, B-Ağacı dizinleri için çok önemlidir, çünkü veriler sırayla depolanır, bu nedenle KEY (ad, soyad) ile bir dizin oluşturmanıza destek verin ve soyadı John ile başlayan tüm kişileri ararsanız , dizin kazandı ' First_name sütununu atladığınız için size yardımcı olmayacaktır , bu nedenle dizin yalnızca bilgileri dizinin aynı sırasına göre aradığınızda kullanacaktır.
Karma Dizinleri : Karma dizini, kesin arama için yararlı olan karma tablonun üstünde oluşturulur, bu nedenle MySql'in yaptığı şey, bir Karma dizini oluşturduğumuzda MySql, karma kodunu hesaplar ve daha hızlı arama için eşdeğer satıra bir işaretçiyi ona bağlar. .
Bunu ne zaman kullanmalı:
- Tam Eşleme: Karma dizini yalnızca tam aramalar için sorgularınız olduğunda yararlıdır.
Unutulmaması gerekenler:
- Hash Index, aralık sorgularında yardımcı olmaz.
- Karma Dizini, kısmi anahtar eşleştirmesi için çalışmaz.
Sorgu Optimizasyonları:
- Her zaman yalnızca ihtiyacınız olan satırları aldığınızdan ve sütun seçerken mümkün olduğunca * kaçının .
- Çok büyük bir sorgu çalıştırmak yerine, bir sürü kısa sorgu çalıştırın, böylece uzun süre çok fazla satırı kilitlemeyecektir.
- Kullanım İÇİNDE yerine JOIN zaman çünkü yapabilirsiniz IN daha önbelleklenmesinde daha verimlidir JOIN.
- Yapabildiğiniz her zaman Dizinleri kullanın.