mysql 查看並開啟查詢緩存


如何查看並開啟查詢緩存

查看是否開啟查詢緩存:

mysql> show variables like "%query_cache%";
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | OFF       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set (0.00 sec)

query_cache_type:是否開啟查詢緩存,0 表示不開啟查詢緩存,1 表示始終開啟查詢緩存 (不要緩 存使用 sql_no_cache), 2 表示按需開啟查詢緩存 (需要緩存使 用 sql_cache)
query_cache_size:給緩存分配的最大內存空間

FLUSH QUERY CACHE : 清理查詢緩存內存碎片 (不會清理查詢緩存)
RESET QUERY CACHE : 從查詢緩存中移出所有查詢
FLUSH TABLES : 關閉所有打開的表,同時該操作將會清空查詢緩存中的內容

開啟查詢緩存:需要修改配置文件,linux my.cnf

[root@localhost www]# find / -name my.cnf
/etc/my.cnf

[root@localhost www]# vim /etc/my.cnf

添加query_cache_type=1

[root@localhost www]# systemctl restart mysqld

查詢結果:

SELECT * from purchase_order WHERE order_sn like "ry2bhxtAu4%"
> OK
> 時間: 2.674s

SELECT * from purchase_order WHERE order_sn like "ry2bhxtAu4%"
> OK
> 時間: 0.002s

以上是查看和開啟查詢緩存的demo,下面記錄一下查詢緩存的概念、優缺點及應用注意點:

了解什么是查詢緩存,需要先了解MySQL的執行流程,這里文字描述
1.客戶端向MySQL服務器發送一條查詢請求
2.服務器先查詢查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結果,否則進入下一階段
3.服務器進行SQL解析,預處理、再由優化器生成對應的執行計划
4.MySQL根據執行計划,調用存儲引擎的API來執行查詢
5.將結果返回給客戶端,同時緩存查詢結果

可以了解到 查詢緩存 相當於一個hash結構,哈希值索引,這個哈希值通過查詢本身、當前要查詢的 數據庫、客戶端協議版本號等一些可能影響結果的信息計算得來。所以兩個查詢在任何字符上的不同 (例如 : 空格、注釋),都會導致緩存不會命中。
簡單理解為:開啟查詢緩存后,在滿足緩存條件下,可以快速返回結果集。比如demo中從2s到0.01s的查詢返回。

那么具備命中緩存的條件是什么呢,哪些不會緩存呢?

  • 查詢中包含任何用戶自定義函數、存儲函數、用戶變量、臨時表、MySQL庫中的系統表,其查詢結果 都不會被緩存。比如函數 NOW() 或者 CURRENT_DATE() 會因為不同的查詢時間,返回不同的查詢結果,再 比如包含 CURRENT_USER 或者 CONNECION_ID() 的查詢語句會因為不同的用戶而返回不同的結果,將這樣 的查詢結果緩存起來沒有任何的意義

  • MySQL 查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表 (數據或結構) 發生變化,那么和這張表相關 的所有緩存數據都將失效。正因為如此,在任何的寫操作時,MySQL必須將對應表的所有緩存都設置為失 效。如果查詢緩存非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,甚至導致系統僵死一會兒

查詢緩存對系統的額外消耗不僅僅在寫,讀也會有消耗:

  1. 任何的查詢語句在開始之前都必須經過檢查,即使這條 SQL語句 永遠不會命中緩存
  2. 如果查詢結果可以被緩存,那么執行完成后,會將結果存入緩存,也會帶來額外的系統消耗

基於此,並不是什么情況下查詢緩存都會提高系統性能,緩存和失效都會帶來額外消耗,特別是寫密集型應用,只有當緩存帶來的資源節約大於其本身消耗的資源時,才會給系統帶來性能提升。可以嘗試打開查 詢緩存,並在數據庫設計上做一些優化 :

  1. 用多個小表代替一個大表,注意不要過度設計
  2. 批量插入代替循環單條插入
  3. 合理控制緩存空間大小,一般來說其大小設置為幾十兆比較合適
  4. 可以通過 SQL_CACHE 和 SQL_NO_CACHE 來控制某個查詢語句是否需要進行緩存
    注 : SQL_NO_CACHE 是禁止緩存查詢結果,是從設置后開始的,如果之前有緩存的話,滿足命中條件還是可以作為緩存結果返回的。

補充:

mysql服務端分層:
連接層:主要是線程管理,對程序連接的管理
sql層:解析sql,優化sql
存儲引擎層:innodb,myisam存儲引擎

連接層:1.連接后的用戶密碼的校驗。2.校驗后的連接進行線程分配管理。3.對用戶校驗后的數據庫表的操作權限的校驗
mysql最大連接數:show variables like "%max_connections%";
當前用戶的連接:show processlist;
sql層:sql語句是由連接層傳遞過來的
如:select * from user where id > 10 and (age >11 or sex = 0 );

  1. 先判斷sql語句的類型
    (query(select)),dml(insert, update, delete), ddl(alter), status(show status)等

  2. 假設query
    mysql8之前是先判斷查詢緩存是否開啟,如果開啟查詢緩存,看是否命中,如果命中,那么直接返回結果,反之繼續執行。
    mysql8.0之后,執行流程是解析器,sql解析器,語法解析器。
    sql解析器:根據查詢的sql語句將sql划分為小token
    將上面的sql語句分成了 select,*,from,where,id,>,10。。。
    得到前面分解的token,根據token去進行排列組合(關鍵字and or)成解析樹
    是根據where條件中的關鍵詞進行組合。

優化器做了什么?
優化器:根據解析樹,選擇合適的執行計划(這個計划不一定最優)
1.獲取表結構信息(字段信息,字段類型,存儲位置,索引信息)獲取的信息是查詢的表的信息。如果是join那么就是獲取兩張表的信息。
2. 根據解析樹進行條件過濾,主要是一些沒有意義的查詢 1=1
3.索引信息 來確定、判斷執行計划
4.執行這個計划,在索引以及條件等來過濾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM