1. 程式人生 > 其它 >每天一道LeetCode Day14:二叉樹的鋸齒層序遍歷

每天一道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 |

+------------------------------+--------------------------+