MySQL sorguları önbelleğe alıyor mu?


19

PHP Veri Nesneleri (PDO) ile bir MySQL veritabanı arabirim ve kapsamlı bir SQL sorgusu yürütüyorum. Normal olarak, yaklaşık 1500 ms sürer; Hala optimize etmem gerekiyor. Ben PHP komut dosyası arasında kısa bir ara ile iki kez çalıştırdığımda, sorgu sadece yaklaşık 90 ms sürer. Sorgu her iki durumda da aynıdır. Komut dosyasını aynı sorguyla çalıştırdığımda, bir süre sonra tekrar 1500 ms sürüyor.

Neden? Veritabanı otomatik olarak önbellekliyor mu? Veritabanı önbelleği kaydedip otomatik olarak siler bir süre var mı?

Sonuçların PHP tarafından önbelleğe alınamayacağını düşünüyorum, çünkü bu iki farklı iş parçacığında gerçekleşir. Ben veritabanı değişti olup olmadığını bilmiyorum, çünkü PHP sonuçları önbelleğe olacağını düşünmek olmaz.

Veritabanına yeni satırlar eklemek için her dakika çalışan bir komut dosyası var. Bu, bir süre sonra tekrar 1500 ms sürmesinin de nedeni olabilir; ilgili tablolar artık aynı olmadığından önbellek silinirdi.


Bana kodunu göster. Sorgunuza ihtiyacım yok, sadece nasıl test edeceğiniz.

3
Evet, mySQL sorguları önbelleğe alır. Zekice böyle.

@Kasyx hangi kodu? Bu sadece temel PDO, ama ben PHP betiğini iki kez çalıştırdığım için PHP'nin önbelleğe alabileceğini düşünmüyorum, sorguyu bir betiğin içinde iki kez çalıştırmıyorum. Ayrıca, pdo'yu neden soruyla gerçekten alakalı olmayan bir şekilde düzenlediğinizi açıklayabilir misiniz ?

3
Tüm DBMS'lerin bir tür sayfa düzeyinde önbelleği vardır. Birçoğu, sorgu yürütme planlarını ve hatta sorgu sonuçlarını ( MySQL dahil ) önbelleğe alarak bunun ötesine geçer . Bu son şeyin gözlemlediğiniz davranış için ana suçlu olduğundan şüpheleniyorum.
Branko Dimitrijevic

Her dakika kesici uç mu yapıyorsunuz? Sıralama şu giren ilk çıkar!
Grant Thomas

Yanıtlar:


15

Bu büyük olasılıkla MySQL Sorgu Önbelleğinin bir eseridir .

SQL sorgusunu çalıştırırsınız, MySQL sonucunu ve hızlıysa bir sonraki çalıştırmayı önbelleğe alır. Sorgunuz tarafından başvurulan tablolara veri eklemek için komut dosyasını çalıştırdığınızda, sonuç önbelleği geçersiz olur ve sorgunun bir dahaki sefere "gerçek" olarak yürütülmesi gerekir.

Yukarıda bağlantılı MySQL belgelerinden:

Neredeyse tamamen sabit bir SELECT deyimi kümesinden oluşan bir sorgu karışımının, sık INSERT ifadelerinin önbellekteki sonuçların sürekli geçersiz kılınmasına neden olduğu bir karışımdan çok önbelleği etkinleştirmesinden yararlanma olasılığı daha yüksektir.


5

Evet, mySQL (diğer tüm popüler veritabanı ürünleri ile ortak olarak) kendisine yapılan sorguları önbelleğe alır.

Önbelleğe alma oldukça zekidir - sorgunun tam parametreleri aynı olmasa bile genellikle sorgu için önbellek kullanabilir. Bu performansta büyük bir fark yaratabilir.

Önbellek tamamen DB sunucu yazılımının içinde kontrol edilir; önbelleğin ne içerdiğine veya belirli bir öğenin önbellekte ne kadar kalacağına ilişkin bir görüşünüz yoktur; diğer sorguların ne çağrıldığına bağlı olarak herhangi bir anda üzerine yazılabilir. Performansa yardımcı olmak için oradadır, ancak performansa güvenilmemelidir.

Bununla ilgili daha fazla bilgiyi MySQL kılavuzunda bulabilirsiniz .

Buna ek olarak, PDO kullanarak sorgularınızı "Hazır deyimler" olarak yazarak parametreleri düz metin sorgusu dizgisine kodlamak yerine bağlayabilirsiniz. Bu aynı zamanda DB sunucusu üzerinde önbellek etkisi vardır ve tekrarlanan sorgular için de performansı artıracaktır.


2
"MySQL 5.1.17'den itibaren sorgu önbelleği, Bölüm 8.6.3.1," Sorgu Önbelleği Nasıl Çalışır "bölümünde açıklanan koşullar altında hazırlanmış ifadeler için kullanılır. 5.1.17'den önce, sorgu önbelleği hazırlanmış ifadeler için kullanılmaz." dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
" diğer tüm popüler veritabanı ürünleri ile ortak ": bu biraz yanıltıcı. Hiçbir DBMS sorgu sonuçlarını MySQL'in yaptığı gibi aktif olarak önbelleğe alır . DBMS genellikle sorgu sonuçlarını değil, yalnızca tablo (veya dizin) verilerini önbelleğe alır . Çoğu sorgu exeution planını (ve "source" sorgusunu) önbelleğe alır
a_horse_with_no_name

3
"sorgunun tam parametreleri aynı olmasa bile genellikle sorgu için önbellek kullanabilir" tamamen yanlıştır. Önbellekten sunulması için, sorgunun bayt için bayt olması gerekir. Aksi takdirde özdeş bir sorgu arasındaki SELECT *ve hatta arasındaki fark bile select *önbellekten sunulmayacaktır. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Tutarlılık için 5.1 bağlantı gönderildi, ancak tüm sürümler için geçerlidir.
Michael - sqlbot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.