每天一道LeetCode Day14:二叉樹的鋸齒層序遍歷
查詢快取的定義
qeury cache是一個記憶體池,用於快取select語句的sql文字和結果集,當後面有相同的sql語句時(且表的資料未發生改變),mysql僅做語法和許可權驗證,然後會跳過解析、優化器、介面呼叫、innodb執行的階段,直接到查詢快取中把對應的結果集返回給會話。相同sql是指sql文字完全一樣,且沒有變數和類似now()這樣的函式。只要表有變動,qc就會被flush。qc也不支援分割槽表
qc的前提
1.查詢快取在對一些不經常變動的表
2.qc對sql的大小寫敏感,select和Select是不一樣的,文字至少必須一模一樣才有可能觸發qc。這個跟sql id有些類似,不同是sql文字的sql id是不一樣的(md5轉碼),sql id不同可能就需要重新解析,當然qc本身是不需要解析的。
3.不能有變數和不確定的資料,比如now()函式
4.非分割槽表的結果集
5.結果集大小小於qc size
qc的優勢
1.有大量一致性sql執行,sql執行效率會有提升
2.sql執行時間很長,資源消耗較多,但是返回結果很少,那麼很適合查詢快取。
qc的劣勢
1 在某些情況下,qc的效率可能會更低,這取決於什麼樣的業務邏輯場景
2 表有資料更新時,qc會flush資料,如果qc size較大會消耗資源
3 第一次觸發qc時,會載入結果集,如果頻繁載入會對效能有較大影響
4 記憶體碎片也可能導致第一次qc的結果集載入不了,即使qc size比結果集大
sql_cache 語句
當query_cache_type處於 ON or DEMAND時,使用sql_cache可以讓sql走qc
使用SQL_NO_CACHE不走qc。當qc關閉時,肯定不會去qc查詢結果集
SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;
關閉qc
在真實環境中,qc可能引發效能問題,建議關閉qc
設定query_cache_size為0,可動態調整
mysql> show variables like '%query%';
+------------------------------+--------------------------+
| Variable_name | Value |
+------------------------------+--------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/lzl-slow.log |
+------------------------------+--------------------------+
13 rows in set (0.05 sec)
mysql>
mysql> set global query_cache_size=0;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show variables like '%query%';
+------------------------------+--------------------------+
| Variable_name | Value |
+------------------------------+--------------------------+
| binlog_rows_query_log_events | OFF |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/lzl-slow.log |
+------------------------------+--------------------------+