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的確認: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 鎖定查詢快取。 |
如果我們在查詢中使用任何變量,無論是在函數還是分區狀態下,查詢快取都會變得無效。例如,如果我們正在處理大數據,並且我們使用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中文網其他相關文章!