Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Bu, “Laravel’i Optimize Etmek” dizisinde 4 Madde’nin 2. maddesidir.
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE
Son makalemde, Laravel uygulamasının performansını optimize etmek için kullanabileceğimiz bazı basit komutlar ve bazı temel kod ayarlamaları görüyoruz. Bu makalede, çok fazla veri yapmaya başladığınızda Laravel uygulamanızın yavaş kalmaması için sorgunun performansını artırmak için veritabanı dizinini nasıl kullanacağını göreceğiz. Bu yazıdaki örnekte performansımı% 100’e yükseltebilirim, ancak kilometreniz neredeyse kesinlikle değişecektir.
Veritabanı dizini nedir? Önceki veritabanı indekslemesini hiç düşünmediyseniz, bir süredir bir veritabanı dizin kullanmış olabileceğinizi bilmek şaşırabilirsiniz. MySQL’de ana anahtar sütunu (genellikle ID olarak adlandırılır) ile bir tablo yaptıysanız, MySQL aslında sütun için bir dizin yapmıştır (varsayılan olarak birincil olarak adlandırılır). Daha hızlı bir WordPress sitesi için SQL sorgu optimizasyonu hakkında önceki IAIN gönderisini okuduysanız, zaten hangi veritabanı dizinine sahip olduğu hakkında iyi bir fikriniz olacak.
Veritabanı dizini, “dizin” verilerini koruyarak tablodan veri alma hızını artırır. Bunu bir kitap dizini olarak düşünün, ancak veritabanı tablonuz için. Dizin, tüm tabloyu herhangi bir zamanda taramak zorunda kalmadan doğru verilerin satırlarını veya satırlarını hızlı bir şekilde bulmak için kullanılır. Küçük veritabanları için küçük veritabanı sorgusu çok hızlı olduğundan minimal performans iyileştirmesi. Ancak, tablonun boyutu artmaya başladıktan sonra (milyonlarca satır düşünün), dizin olmadan tablo sorguları yaparken performans üzerinde yeterince büyük bir etki görmeye başlayacaksınız. Dizin kullanırken dikkate alınması gereken bazı fedakarlıklar vardır. Dizin depolama alanı kullanır, ancak kullanılan alan genellikle veritabanı boyutuna kıyasla minimaldir. Bununla birlikte, bir dizin olan küçük bir tablo için, sorguyu çalıştırırken dizin işlemek zorunda oldukları ve bir sorgu yazmak daha yavaş olacaktır çünkü dizin yeniden inşa etmeleri gerektiğinden MySQL’in daha fazla çalışmasını sağlayabilir. Bu nedenle, sadece tablonun boyutu artmaya başladıktan sonra dizin eklenmesi önerilir.
Dizin sorunları teşhis etmek Son makalemde, kullanıcıların birçok görevi olabilmesi için basit bir ödev ve ilişki modeline sahip bir Laravel uygulaması oluşturuyoruz. Bu örneğe devam ederek, bir kullanıcının ~ 2,4 milyon görevi olduğunu ve kullanıcının ödevini almak istiyoruz. Bunun gibi bir şey yapabiliriz: $ user = user :: find (1); $ Tasks = $ user-> Tasks ()-> get (); Dikkat edebileceğiniz ilk şey, PHP’nin belleğin biteceği için sayfanın yüklenemeyeceğidir (örn. “X baytının izin verilen bellek boyutu tükenir”). Bu sorunu teşhis etmeye başlamak için veritabanı yönetimi uygulamasına atlamamız gerekiyor (şu anda TabloPlus kullanıyorum). Laravel tarafından üretilecek RAW SQL sorgularını çalıştıralım: ‘görevler’ nin ‘görevler’. Harika değil. Bu sorgu ile sorun çıkarmamıza yardımcı olmak için, perde arkasında neler olduğunu anlamamıza yardımcı olmak için MySQL açıklamalarını açıklama ifadelerini kullanabiliriz. Sadece kuyruğu tekrar çalıştırın ama sorgunun başlangıcına ekleyin: `görevler ” nden * seçin * seçin *. Bilgi, ancak bulmak önemli alan mümkün_keyler ve anahtar alanlardır. Bu bize bu sorgu için hangi dizin (anahtar) mevcut olduğunu ve hangi dizin gerçekten kullanıldığını söyleyecektir. Sıra alanının bu sorgu sırasında kaç satırın tarandığını söylediğini belirtmek de önemlidir. Bunu ödevimiz için çalıştırdığımda aşağıdaki sonuçları alıyorum:
Bu durumda, herhangi bir dizin kullanılmadığını ve ~ 2.4 milyon satırın hepsini taramamız gerektiğini unutmayın! Sorunun bu kadar uzun sürmesi şaşırtıcı değil. Veritabanı Dizin Ekleme Şimdi sorunu teşhis ettik, görevler tablosu için dizin kullanıcı_id sütuna eklemeye devam edelim. Genellikle Laravel’de yeni geçiş oluşturarak ve $ table-> index (): schema :: tablo (‘görevler’, işlev (Blueprint $ tablo) {$ table-> dizin (‘ User_id ‘);}); Endeks eklemek için geçiş yaptıktan sonra kuyruğumuzu tekrar çalıştıralım ve ne kadar süreceğini görelim. Makinemde, Kueri’nin artık ~ 500 ms’ye ihtiyacı var. Bu daha önce gereken zamanın yarısı! İfadeyi çalıştırırsak, tekrar bakalım, perde arkasında neler olduğunu görelim: Mevcut sorgunun yeni yaptığımız Tasks_user_ID_INDEX kullandığını ve bu yeni dizin kullanarak, taranması gereken satır sayısı düştü ~ 2,4 milyondan ~ 400.000’e. Başarı! Bu noktada, veritabanı tablosuna bir dizin eklenirken kilometrenizin farklı olabileceğine dikkat edilmelidir, çünkü performans artışı sadece tablodaki veri miktarına değil, aynı zamanda çalıştırılan kuyruk türüne de bağlıdır. Ek bir not olarak, masaya yabancı bir anahtar olarak user_id ekleyebiliriz. Yabancı anahtarlar otomatik olarak sütunları endeksle birlikte veri bütünlüğünü korurlar.
MySQL, dizin düzlemi Where fıkranızdaki her alanı içermese de dizin kullanacak kadar akıllıdır. Yukarıdaki iki dizin eklersem, açıklama, sorgularımda birkaç cümlem olmasına rağmen, kombine dizin yerine kullanılacak tek User_ID dizinini gösterecektir.
MySQL gerekirse birkaç dizin kullanabilir.
Birleşik dizindeki alan dizisinin de bir etkisi olabilir. Genel olarak, en yaygın olanlardan en yaygın olanlara göre sıralanmalıdırlar.
Dolayısıyla, daha fazla kombine endeks eklemeden performansta bir artış görebilirsiniz. MySQL’in perde arkasında ne yaptığını öğrenmek için açıklamak arkadaşınızdır.
Bir dahaki sefere, veritabanlarının indekslemenin performans için neden önemli olduğunu ve Laravel uygulamanızda nasıl kullanılacağına dair temel bir anlayışa sahip olduğunuzda, yapmadıysanız veritabanınızda uygulamaya başlayabilmeniz gerekir. Doğru endeksi eklemek için küçük bir sanat var, ancak çoğu şey gibi egzersiz mükemmel hale geliyor. Bir sonraki makalemde, nesne önbelleğini kullanarak laravel performansını nasıl daha da geliştirebileceğimizi göreceğiz. Hiç önceki Laravel’de bir veritabanı dizini kullandınız mı? Paylaşmak için veritabanı dizinleme ipuçları var mı? Yorumlarda bize söyleyin. Bu, “Laravel’i Optimize Etmek” dizisinde 4 Madde’nin 2. maddesidir.
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE
Son makalemde, Laravel uygulamasının performansını optimize etmek için kullanabileceğimiz bazı basit komutlar ve bazı temel kod ayarlamaları görüyoruz. Bu makalede, çok fazla veri yapmaya başladığınızda Laravel uygulamanızın yavaş kalmaması için sorgunun performansını artırmak için veritabanı dizinini nasıl kullanacağını göreceğiz. Bu yazıdaki örnekte performansımı% 100’e yükseltebilirim, ancak kilometreniz neredeyse kesinlikle değişecektir.
Veritabanı dizini nedir? Önceki veritabanı indekslemesini hiç düşünmediyseniz, bir süredir bir veritabanı dizin kullanmış olabileceğinizi bilmek şaşırabilirsiniz. MySQL’de ana anahtar sütunu (genellikle ID olarak adlandırılır) ile bir tablo yaptıysanız, MySQL aslında sütun için bir dizin yapmıştır (varsayılan olarak birincil olarak adlandırılır). Daha hızlı bir WordPress sitesi için SQL sorgu optimizasyonu hakkında önceki IAIN gönderisini okuduysanız, zaten hangi veritabanı dizinine sahip olduğu hakkında iyi bir fikriniz olacak.
Veritabanı dizini, “dizin” verilerini koruyarak tablodan veri alma hızını artırır. Bunu bir kitap dizini olarak düşünün, ancak veritabanı tablonuz için. Dizin, tüm tabloyu herhangi bir zamanda taramak zorunda kalmadan doğru verilerin satırlarını veya satırlarını hızlı bir şekilde bulmak için kullanılır. Küçük veritabanları için küçük veritabanı sorgusu çok hızlı olduğundan minimal performans iyileştirmesi. Ancak, tablonun boyutu artmaya başladıktan sonra (milyonlarca satır düşünün), dizin olmadan tablo sorguları yaparken performans üzerinde yeterince büyük bir etki görmeye başlayacaksınız. Dizin kullanırken dikkate alınması gereken bazı fedakarlıklar vardır. Dizin depolama alanı kullanır, ancak kullanılan alan genellikle veritabanı boyutuna kıyasla minimaldir. Bununla birlikte, bir dizin olan küçük bir tablo için, sorguyu çalıştırırken dizin işlemek zorunda oldukları ve bir sorgu yazmak daha yavaş olacaktır çünkü dizin yeniden inşa etmeleri gerektiğinden MySQL’in daha fazla çalışmasını sağlayabilir. Bu nedenle, sadece tablonun boyutu artmaya başladıktan sonra dizin eklenmesi önerilir.
Dizin sorunları teşhis etmek Son makalemde, kullanıcıların birçok görevi olabilmesi için basit bir ödev ve ilişki modeline sahip bir Laravel uygulaması oluşturuyoruz. Bu örneğe devam ederek, bir kullanıcının ~ 2,4 milyon görevi olduğunu ve kullanıcının ödevini almak istiyoruz. Bunun gibi bir şey yapabiliriz: $ user = user :: find (1); $ Tasks = $ user-> Tasks ()-> get (); Dikkat edebileceğiniz ilk şey, PHP’nin belleğin biteceği için sayfanın yüklenemeyeceğidir (örn. “X baytının izin verilen bellek boyutu tükenir”). Bu sorunu teşhis etmeye başlamak için veritabanı yönetimi uygulamasına atlamamız gerekiyor (şu anda TabloPlus kullanıyorum). Laravel tarafından üretilecek RAW SQL sorgularını çalıştıralım: ‘görevler’ nin ‘görevler’. Harika değil. Bu sorgu ile sorun çıkarmamıza yardımcı olmak için, perde arkasında neler olduğunu anlamamıza yardımcı olmak için MySQL açıklamalarını açıklama ifadelerini kullanabiliriz. Sadece kuyruğu tekrar çalıştırın ama sorgunun başlangıcına ekleyin: `görevler ” nden * seçin * seçin *. Bilgi, ancak bulmak önemli alan mümkün_keyler ve anahtar alanlardır. Bu bize bu sorgu için hangi dizin (anahtar) mevcut olduğunu ve hangi dizin gerçekten kullanıldığını söyleyecektir. Sıra alanının bu sorgu sırasında kaç satırın tarandığını söylediğini belirtmek de önemlidir. Bunu ödevimiz için çalıştırdığımda aşağıdaki sonuçları alıyorum:
Bu durumda, herhangi bir dizin kullanılmadığını ve ~ 2.4 milyon satırın hepsini taramamız gerektiğini unutmayın! Sorunun bu kadar uzun sürmesi şaşırtıcı değil. Veritabanı Dizin Ekleme Şimdi sorunu teşhis ettik, görevler tablosu için dizin kullanıcı_id sütuna eklemeye devam edelim. Genellikle Laravel’de yeni geçiş oluşturarak ve $ table-> index (): schema :: tablo (‘görevler’, işlev (Blueprint $ tablo) {$ table-> dizin (‘ User_id ‘);}); Endeks eklemek için geçiş yaptıktan sonra kuyruğumuzu tekrar çalıştıralım ve ne kadar süreceğini görelim. Makinemde, Kueri’nin artık ~ 500 ms’ye ihtiyacı var. Bu daha önce gereken zamanın yarısı! İfadeyi çalıştırırsak, tekrar bakalım, perde arkasında neler olduğunu görelim: Mevcut sorgunun yeni yaptığımız Tasks_user_ID_INDEX kullandığını ve bu yeni dizin kullanarak, taranması gereken satır sayısı düştü ~ 2,4 milyondan ~ 400.000’e. Başarı! Bu noktada, veritabanı tablosuna bir dizin eklenirken kilometrenizin farklı olabileceğine dikkat edilmelidir, çünkü performans artışı sadece tablodaki veri miktarına değil, aynı zamanda çalıştırılan kuyruk türüne de bağlıdır. Ek bir not olarak, masaya yabancı bir anahtar olarak user_id ekleyebiliriz. Yabancı anahtarlar otomatik olarak sütunları endeksle birlikte veri bütünlüğünü korurlar.
Beklediğiniz gibi, bir veritabanı dizin eklemek için küçük bir sanat var. Örneğin, sorgularınızda bazı maddeler varsa, Where cümlenizdeki her alanı içeren bir çok sütunlu dizin (birleşik) eklemek mantıklı olabilir. Sorularımızın şudur: `görevler ” nden *”den seç * ‘. Bu: şema :: tablo (‘görevler’, işlev (Blueprint $ table) {$ table-> dizin ([‘user_id’, ‘created_at’]);}); Yukarıdaki sorguları kombine bir dizinle çalıştırın, motorumdaki sorguların performansını tekrar% 50 civarında iyileştirin. Ancak şunları bilin.
Daha fazla dizin eklemek veritabanı boyutunuzu artıracak ve veritabanı RAM’inizi kullanacaktır (çünkü MySQL dizinini bellekte depolamaya çalışır).MySQL, dizin düzlemi Where fıkranızdaki her alanı içermese de dizin kullanacak kadar akıllıdır. Yukarıdaki iki dizin eklersem, açıklama, sorgularımda birkaç cümlem olmasına rağmen, kombine dizin yerine kullanılacak tek User_ID dizinini gösterecektir.
MySQL gerekirse birkaç dizin kullanabilir.
Birleşik dizindeki alan dizisinin de bir etkisi olabilir. Genel olarak, en yaygın olanlardan en yaygın olanlara göre sıralanmalıdırlar.
Dolayısıyla, daha fazla kombine endeks eklemeden performansta bir artış görebilirsiniz. MySQL’in perde arkasında ne yaptığını öğrenmek için açıklamak arkadaşınızdır.
Bir dahaki sefere, veritabanlarının indekslemenin performans için neden önemli olduğunu ve Laravel uygulamanızda nasıl kullanılacağına dair temel bir anlayışa sahip olduğunuzda, yapmadıysanız veritabanınızda uygulamaya başlayabilmeniz gerekir. Doğru endeksi eklemek için küçük bir sanat var, ancak çoğu şey gibi egzersiz mükemmel hale geliyor. Bir sonraki makalemde, nesne önbelleğini kullanarak laravel performansını nasıl daha da geliştirebileceğimizi göreceğiz. Hiç önceki Laravel’de bir veritabanı dizini kullandınız mı? Paylaşmak için veritabanı dizinleme ipuçları var mı? Yorumlarda bize söyleyin. Bu, “Laravel’i Optimize Etmek” dizisinde 4 Madde’nin 2. maddesidir.
Laravel Bölüm 1’i Optimize Etmek: Temel Bilgiler
Laravel Bölüm 2’yi optimize etme: Bir veritabanı diziniyle sorgunun performansını artırın
Laravel Bölüm 3’ü Optimize Etme: Nesne Önbellekleme ile Performansı Artırın
Laravel Bölüm 4: Kuyruk Hususları, Ön Uç ve OPCACHE