MySQL - memaksa untuk tidak menggunakan cache untuk menguji kecepatan permintaan

343

Saya sedang menguji kecepatan beberapa pertanyaan di MySQL. Basis data sedang meng-cache kueri ini sehingga menyulitkan saya untuk mendapatkan hasil yang dapat diandalkan saat menguji seberapa cepat kueri ini.

Apakah ada cara untuk menonaktifkan caching untuk kueri?

Sistem: MySQL 4 di webhosting Linux, saya memiliki akses ke PHPMyAdmin.

Terima kasih


sumber

Jawaban:

527

Coba gunakan opsi SQL_NO_CACHE (MySQL 5.7) dalam permintaan Anda. (Pengguna MySQL 5.6 klik DI SINI )

misalnya.

SELECT SQL_NO_CACHE * FROM TABLE

Ini akan menghentikan hasil caching MySQL, namun perlu diketahui bahwa cache OS dan disk lainnya juga dapat memengaruhi kinerja. Ini lebih sulit untuk berkeliling.

Jarod Elliott
sumber
5
Dokumentasi
Salman von Abbas
4
Artikel bagus tentang cache Query mysql. Cara mengatur dan melihat cache beraksi! Layak dibaca. databasejournal.com/features/mysql/article.php/3110171/...
Adrian P.
1
Sebelum mencoba meningkatkan kinerja, coba mulai ulang server mysql Anda. Mungkin beberapa proses mempengaruhi segalanya. Itu terjadi pada saya. Meskipun ini adalah komentar yang tidak memiliki koneksi langsung dengan masalah ini, ini dapat membantu banyak orang.
dellasavia
2
Ini menghentikannya dari caching hasil tetapi apakah itu juga menghentikannya dari menggunakan cache?
Brett
3
@ Brett lihat komentar SalmanPK kembali pada '11. Halaman dokumen itu secara harfiah 4 kalimat dan menjawab pertanyaan Anda secara langsung. Seandainya halaman tersebut dihapus di masa depan: "Itu tidak memeriksa cache kueri untuk melihat apakah hasilnya sudah di-cache, atau apakah itu cache hasil kueri."
maurice
121

Alternatif lain yang hanya memengaruhi koneksi saat ini:

SET SESSION query_cache_type=0;
John Carter
sumber
Salahku. Itu yang query_cache_sizesaya lihat, bukan query_cache_type. Saya mencampur jawaban Anda dan SeniorDev.
Mike
30

Ada juga opsi konfigurasi: query_cache_size = 0

Untuk menonaktifkan cache permintaan saat startup server, atur variabel sistem query_cache_size ke 0. Dengan menonaktifkan kode cache query, tidak ada overhead yang terlihat. Jika Anda membuat MySQL dari sumber, kemampuan cache kueri dapat dikecualikan dari server sepenuhnya dengan menjalankan konfigurasi dengan opsi --without-query-cache.

Lihat http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

barbushin
sumber
24

Anda juga dapat menjalankan perintah ikuti untuk mereset cache permintaan.

RESET QUERY CACHE
djt
sumber
9
Ini mungkin berlebihan ... idealnya, Anda hanya ingin MySQL untuk sementara waktu mengabaikan cache.
BMiner
3
Anda juga memerlukan izin khusus untuk ini.
Erick Robertson
19

Satu masalah dengan

SELECT SQL_NO_CACHE * FROM TABLE

metode adalah bahwa hal itu tampaknya hanya mencegah hasil caching Anda tidak di-cache. Namun, jika Anda meminta basis data yang secara aktif digunakan dengan permintaan yang ingin Anda uji, maka klien lain mungkin akan men-cache permintaan Anda, yang memengaruhi hasil Anda. Saya terus mencari cara untuk mengatasi ini, akan mengedit posting ini jika saya mengetahuinya.

wbharding
sumber
1
Tetapi jika cache Anda diisi oleh orang lain, Anda akan mendapatkan ilusi menjadi cepat. Namun terkadang tidak.
karatedog
14

Saya akan menggunakan yang berikut ini:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';
Sergio Costa
sumber
3

Menggunakan variabel yang ditentukan pengguna dalam kueri membuat kueri ulang tidak mudah diakses. Saya menemukan indikator yang jauh lebih baik daripada menggunakan SQL_NO_CACHE. Tetapi Anda harus meletakkan variabel di tempat di mana pengaturan variabel tidak akan memengaruhi kinerja:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;
baru ditemukan
sumber
3
"Saya menemukan itu indikator yang jauh lebih baik daripada menggunakan SQL_NO_CACHE." Bagaimana? Tampaknya Anda perlu kasus yang cukup kuat untuk menggunakan peretasan yang tidak jelas atas kata kunci eksplisit, kecuali kata kunci eksplisit tidak melakukan apa yang diklaimnya.
Air
1
@ Air, saya menemukan solusi ini bekerja lebih baik daripada SQL_NO_CACHE juga. SQL_NO_CACHE bekerja untuk pertama kalinya menjalankan kueri, tetapi kemudian setelah itu tidak berfungsi lagi. Saya berasumsi ini disebabkan oleh mekanisme caching lainnya. Saya pikir ini berfungsi lebih baik karena pencarian yang bergantung pada variabel tidak dapat di-cache oleh lapisan atau mekanisme apa pun - setidaknya, itulah tebakan terbaik saya.
Klik
2

Jika Anda ingin menonaktifkan cache Query, atur 'query_cache_size' ke 0 di file konfigurasi mysql Anda. Jika set 0 mysql tidak akan menggunakan cache kueri.

Jinesh
sumber