首頁  >  文章  >  資料庫  >  MySQL中查詢快取的基礎知識有哪些

MySQL中查詢快取的基礎知識有哪些

王林
王林轉載
2023-05-31 10:35:381704瀏覽

什麼是查詢快取?

MySQL 查詢快取雖然在MySQL 5.7 中被棄用(並在8.0 中刪除),但儲存先前在記憶體中運行的語句:換句話說,查詢快取通常將SELECT語句儲存在資料庫的內存中。因此,如果我們執行一個查詢,然後在一段時間後再次執行完全相同的查詢,結果將更快地返回,因為它們將從記憶體而不是從磁碟中檢索。

查詢快取快取查詢和結果集。因此,當我們執行相同的查詢時,查詢快取的結果會立即傳回。查詢快取大小可以透過設定query_cache_size系統變數來控制,但這裡有一個警告:如果您希望查詢使用查詢緩存,它們必須,必須,必須相同,逐字節。這意味著即使您認為這兩個查詢應該以完全相同的方式快取:

SELECT * FROM demo_table WHERE column = 'Demo'; 
#select * from demo_table where column = 'Demo';

事實上,他們不是。如果 MySQL 查詢快取要求所有查詢必須完全相同,那麼即使只有一個位元組不同,也不會傳回任何結果。

所以,總結一下,當MySQL 執行語句時,它做的第一件事就是檢查是否啟用了查詢快取(如果需要複習,請回到我們上一篇關於慢速MySQL 查詢的博客文章。)如果查詢快取啟用後,MySQL 將首先檢查與該查詢的任何相關匹配項;如果沒有匹配項,MySQL 將繼續下一步。若符合項目存在重複,MySQL會從查詢快取中傳回結果。

MySQL內部的查詢快取

在此之前回傳比賽,MySQL的查詢快取要求MySQL的確認:d OES該使用者有必要的權限才能完成這樣的動作?我應該拒絕執行查詢嗎?

以下是MySQL 檢查的權限清單:

#特權

簡單說明
ALL 賦予特定MySQL 使用者所有權限。
SELECT 授予特定 MySQL 使用者從指定資料庫中選擇行的權限。
UPDATE 授予特定 MySQL 使用者更新指定表中現有行的權限。
SHOW DATABASES 可讓特定 MySQL 使用者取得存在於特定 MySQL 實例中的所有 MySQL 資料庫的清單。
USAGE 賦予使用者僅使用 MySQL 的權力,這表示使用者不能在其中執行任何查詢。本質上是無特權的同義詞。


有更多的特權,但你明白了。 MySQL會將與表相關的資訊和快取查詢一起存儲,因此權限對於查詢快取至關重要。權限也很重要,因為它是 MySQL 結果檢查過程的第一階段之一。這是一切的工作原理:

#優先識別

MYSQL 狀態

#解釋
1 MySQL 正在檢查查詢快取中的權限。 首先,MySQL 檢查特定使用者是否有權存取特定結果。
2 MySQL 正在檢查查詢本身的查詢快取。 接下來,MySQL 開始檢查查詢快取中是否有相同的查詢。如果匹配,MySQL 返回;如果沒有,MySQL 繼續下一步。
3 MySQL 將查詢快取中的項目標記為無效。 隨著表的變化,查詢快取需要更新。所以在這一步驟中,MySQL 決定將查詢快取中的條目標記為無效。
4 傳送結果。 MySQL 傳送快取的結果並顯示它。
5 將結果儲存在快取中。 MySQL 將查詢結果儲存在查詢快取中。
6 查詢快取被鎖定。 快取過程現在結束-MySQL 鎖定查詢快取。

「MySql沒有快取!」:要看查詢快取是否損壞?

如果我們在查詢中使用任何變量,無論是在函數還是分區狀態下,查詢快取都會變得無效。例如,如果我們正在處理大數據,並且我們使用SELECT ... INTO OUTFILE將大數據集載入到 MySQL 中,則結果同樣不會被快取。通常,查詢快取SELECT ... [LOCK | FOR | INTO]在使用類似查詢時不起作用,如果我們正在檢查具有NULL值的列中的AUTO_INCREMENT值,則查詢快取也無法使用,這意味著如果我們有一個increment帶有的列AUTO_INCREMENT,而且我們執行這樣的查詢所以:

SELECT * FROM demo_table WHERE increment IS NULL;

查詢快取也不會生效。

你說得沒錯,所有這些特性可能會讓某些人感覺它們沒用。儘管像 MySQL 中的其他功能一樣查詢快取也有自己的限制,因此並非總是有效。除了上述那些,當語句產生警告或語句在具有TEMPORARY儲存引擎的表上運行時以及在其他一些極端情況下,它拒絕工作。每次有人向表寫入任何內容時,查詢快取也會清空。

查詢快取的功能也取決於query_cache_size參數。此參數越大越好,但請注意,此參數在很大程度上取決於您的記憶體。請記住,查詢快取的基本結構預設至少需要 40kB 的儲存空間,其預設值可能在 1MB 到 16MB 之間。若您的資料庫經常讀取數據,則增大參數值可能有助於找到最佳解決方案,需再進行試驗。

您可以使用 "RESET QUERY CACHE" 語句清空查詢快取中的所有內容。如果你使用類似 FLUSH TABLES 的語句,所有的查詢快取值也會被刪除。

MySQL 甚至允許您透過執行查詢來查看查詢快取中儲存了多少查詢:

SHOW STATUS LIKE 'Qcache_queries_in_cache%';

您會得到如下所示的結果:

MySQL:

+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| Qcache_queries_in_cache | 1      |
+-------------------------+--------+

在這種情況下,我們可以看到我們的查詢快取目前快取了一個結果。執行類似的語句FLUSH TABLES,所有值都會消失。

以上是MySQL中查詢快取的基礎知識有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除