MySQL - sorgu hızını test etmek için önbellek kullanmaya zorlama


343

MySQL'de bazı sorguların hızını test ediyorum. Veritabanı bu sorguları önbelleğe alıyor, bu sorguların ne kadar hızlı olduğunu test ederken güvenilir sonuçlar elde etmemi zorlaştırıyor.

Bir sorgu için önbelleğe almayı devre dışı bırakmanın bir yolu var mı?

Sistem: Linux webhosting üzerinde MySQL 4, PHPMyAdmin'e erişimim var.

Teşekkürler

mysql 

Yanıtlar:


527

Sorgunuzda SQL_NO_CACHE (MySQL 5.7) seçeneğini kullanmayı deneyin . (MySQL 5.6 kullanıcıları BURAYA tıklayın )

Örneğin.

SELECT SQL_NO_CACHE * FROM TABLE

Bu, MySQL'in sonuçları önbelleğe almasını durduracak, ancak diğer işletim sistemi ve disk önbelleklerinin de performansı etkileyebileceğini unutmayın. Bunları bulmak daha zordur.



4
Sorgu önbellek hakkında güzel bir makale. Önbellek nasıl kurulur ve işlenirken görün! Okumaya değer. databasejournal.com/features/mysql/article.php/3110171/…
Adrian P.

1
Performansı artırmaya çalışmadan önce, mysql sunucunuzu yeniden başlatmayı deneyin. Bazı süreçler her şeyi etkiliyor olabilir. Benimle oldu. Konu ile doğrudan bağlantısı olmayan bir yorum olmasına rağmen, birçok insana yardımcı olabilir.
dellasavia

2
Bu, sonuçları önbelleğe almasını engeller, ancak önbelleği kullanmasını da engeller mi?
Brett

3
@Brett, SalmanPK'nin 11'deki yorum yolunu görüyor. Bu doc ​​sayfası tam anlamıyla 4 cümledir ve sorunuzu doğrudan yanıtlar. Sayfanın gelecekte kaldırılması durumunda: "Sorgunun önbelleğe alınmış olup olmadığını görmek için sorgu önbelleğini kontrol etmez ya da sorgu sonucunu önbelleğe almaz."
maurice

121

Yalnızca mevcut bağlantıyı etkileyen başka bir alternatif:

SET SESSION query_cache_type=0;

Benim hatam. Bakıyordum query_cache_size, değil query_cache_type. Seninkini ve SeniorDev'in cevabını karıştırıyordum.
Mike


30

Ayrıca yapılandırma seçeneği de vardır: query_cache_size = 0

Sunucu başlangıcında sorgu önbelleğini devre dışı bırakmak için query_cache_size sistem değişkenini 0 olarak ayarlayın. Sorgu önbellek kodunu devre dışı bırakarak, belirgin bir ek yük yoktur. MySQL'i kaynaktan oluşturursanız, --without-query-cache seçeneği ile configure komutu çağrılarak sorgu önbellek yetenekleri sunucudan tamamen çıkarılabilir.

Bkz. Http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


24

Sorgu önbelleğini sıfırlamak için follow komutunu da çalıştırabilirsiniz.

RESET QUERY CACHE

9
Muhtemelen aşırıya kaçmış ... ideal olarak, sadece MySQL'in geçici olarak önbelleği yoksaymasını istiyorsunuz.
BMiner

3
Bunun için özel izinlere de ihtiyacınız var.
Erick Robertson

19

İle ilgili bir sorun

SELECT SQL_NO_CACHE * FROM TABLE

yöntem, yalnızca sorgunuzun sonucunun önbelleğe alınmasını engelliyor gibi görünmesidir. Ancak, test etmek istediğiniz sorguyla etkin olarak kullanılan bir veritabanını sorguluyorsanız, diğer istemciler sorgunuzu önbelleğe alarak sonuçlarınızı etkileyebilir. Bunun yollarını araştırmaya devam ediyorum, bir tane bulursam bu yayını düzenleyeceğim.


1
Ancak önbelleğiniz başkaları tarafından doldurulursa, hızlı olma yanılsamasını alacaksınız. Ama bazen değil.
karatedog

14

Aşağıdakileri kullanırdım:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

Bir sorgu içinde kullanıcı tanımlı bir değişken kullanılması, sorgu sonuçlarının önbelleğe alınamaz olmasını sağlar. Kullanmaktan çok daha iyi bir gösterge buldum SQL_NO_CACHE. Ancak değişkeni, değişken ayarının performansı ciddi şekilde etkilemeyeceği bir yere koymalısınız:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
"Bunu kullanmaktan çok daha iyi bir gösterge buldum SQL_NO_CACHE." Nasıl yani? Açık anahtar kelime iddia ettiği şeyi yapmadığı sürece, açık bir anahtar kelime üzerinde anlaşılır bir hack kullanmak için oldukça güçlü bir duruma ihtiyaç duyacağınız anlaşılıyor.
Air

1
@Air Bu çözümü SQL_NO_CACHE'den daha iyi çalışmak için buldum. SQL_NO_CACHE ilk kez sorguyu çalıştırırken çalıştı, ancak bundan sonra tekrar çalışmadı. Bunun diğer önbellekleme mekanizmalarından kaynaklandığını varsayıyorum. Bunun daha iyi çalıştığını düşünüyorum çünkü bir değişkene dayanan bir arama herhangi bir katman veya mekanizma tarafından önbelleğe alınamaz - en azından benim en iyi tahminim.
Klik

2

Sorgu önbelleğini devre dışı bırakmak istiyorsanız, mysql yapılandırma dosyanızda 'query_cache_size' değerini 0 olarak ayarlayın. Eğer ayarlanmışsa 0 mysql sorgu önbelleğini kullanmaz.

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.