中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL查詢緩存

發布時間:2020-04-24 20:56:41 來源:網絡 閱讀:661 作者:ckl893 欄目:MySQL數據庫


一、查詢緩存說明

MySQL Query Cache是用來緩存我們所執行的SELECT語句以及該語句的結果集,MySql在實現Query Cache的具體技術細節上類似典型的KV存儲,就是將SELECT語句和該查詢語句的結果集做了一個HASH映射并保存在一定的內存區域中。當客戶端發起SQL查詢時,Query Cache的查找邏輯是,先對SQL進行相應的權限驗證,接著就通過Query Cache來查找結果(注意必須是完全相同,即使多一個空格或者大小寫不 同都認為不同,即使完全相同的SQL,如果使用不同的字符集、不同的協議等也會被認為是不同的查詢而分別進行緩存)。它不需要經過Optimizer模塊進行執行計劃的分析優化,更不需要發生同任何存儲引擎的交互,減少了大量的磁盤IO和CPU運 算,所以有時候效率非常高。


二、查詢緩存命中

判斷一個緩存是否被命中,通過查詢語句的HASH值來判斷,HASH值因素包括查詢語句、查詢數據庫、客戶端版本協議等,如查詢語句任何字符的不同,都會導致HASH結果的不同,都可能導致緩存無法命中。有些查詢不能被緩存,如查詢中包含UDF、存儲函數、用戶自定義變量、臨時表、mysql庫中系統表、或者包含列級權限的表、有著不確定值的函數(Now()); 查詢緩存是完全存儲在內存中的,對整個內存空間分配回收等,會額外產生系統資源消耗,這會導致內存碎片的產生。


三、查看查詢緩存的參數

MariaDB [(none)]> show global variables like '%query%';
+------------------------------+--------------------+
| Variable_name                | Value              |
+------------------------------+--------------------+
| expensive_subquery_limit     | 100                |
| ft_query_expansion_limit     | 20                 |
| have_query_cache             | YES                |
| long_query_time              | 10.000000          |
| query_alloc_block_size       | 16384              |
| query_cache_limit            | 1048576            |
| query_cache_min_res_unit     | 4096               |
| query_cache_size             | 16777216           |
| query_cache_strip_comments   | OFF                |
| query_cache_type             | ON                 |
| query_cache_wlock_invalidate | OFF                |
| query_prealloc_size          | 24576              |
| slow_query_log               | OFF                |
| slow_query_log_file          | localhost-slow.log |
+------------------------------+--------------------+
14 rows in set (0.01 sec)

查詢緩存相關變量說明

query_cache_min_res_unit: 查詢緩存中內存塊的最小分配單位;較小值會減少浪費,但會導致更頻繁的內存分配操作;較大值會帶來浪費,會導致碎片過多;

query_cache_limit:能夠緩存的最大查詢結果;對于有著較大結果的查詢語句,建議在SELECT中使用SQL_NO_CACHE

query_cache_size:查詢緩存總共可用的內存空間;單位是字節,必須是1024的整數倍;

query_cache_type: ON, OFF, DEMAND

  a、0(OFF):關閉 Query Cache 功能,任何情況下都不會使用 Query Cache;

  b、1(ON):開啟 Query Cache 功能,但是當SELECT語句中使用SQL_NO_CACHE提示后,將不使用Query Cache;

  c、2(DEMAND):開啟Query Cache 功能,但是只有當SELECT語句中使用了SQL_CACHE 提示后,才使用Query Cache。

query_cache_wlock_invalidate:如果某表被其它的連接鎖定,是否仍然可以從查詢緩存中返回結果;默認值為OFF,表示可以在表被其它連接鎖定的場景中繼續從緩存返回數據;ON則表示不允許;

MariaDB [(none)]> show global status like 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16759656 |
| Qcache_hits             | 0        |
| Qcache_inserts          | 0        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 7        |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+
8 rows in set (0.00 sec)


查看緩存變量參數說明:

Qcache_free_blocks: 緩存池中空閑塊的個數,空閑的內存塊。

Qcache_free_memory: 緩存中空閑內存空間

Qcache_hits: 緩存命中次數

Qcache_inserts: 可緩存查詢語句的結果被放入緩存的次數

Qcache_lowmen_prunes: 有多少次是因為查詢緩存內存空間太少而使用LRU算法清理緩存的次數

Qcache_not_cached: 可緩存卻未能緩存的結果,例如查詢結果超出緩存塊大小,查詢中包含可變函數等

Qcache_queries_in_cache: 當前緩存中緩存的SQL數量

Qcache_total_blocks: 整個查詢緩存有多少內存塊


緩存命中率:Qcache_hits/(Qcache_hits+Com_select)


四、分析和配置查詢緩存流程及提高緩存命中率

MySQL查詢緩存

.開始,如果查詢緩存命中率是否可以接受?如果可以的話,就結束。

②.不能接受目前的緩存命中率,查看大部分查詢不是可緩存?是的話,就是大部分查詢都不能緩存,query_cache_limit足夠大嗎?如果是,就結束,說明查詢不能緩存,有可能是用戶自定義變量、存儲函數等,這種情況,建議關閉查詢緩存。如果不是足夠大,則需要增加此值。

③.1.大部分查詢緩存都是可以緩存,但是卻沒有被緩存。是否發生很多嚴重工作?

        是的話,查看緩存是不是被碎片化。需要降低query_cache_min_res_unit的值或是否flush query cache命令來整理緩存,減少碎片。

③.2.如果緩存不是因為碎片太多導致沒有被緩存,內存過低發生的修正工作?

④.1.如果是內存過低,則增加query_cache_size。

④.2.如果不是內存過低,是否有很多的更新語句?頻繁的更新表導致的緩存不能被命中,是有很多頻繁更新的語句,負載不適合緩存,建議關閉緩存。不是有很多頻繁更新的語句,則有其他配置的問題。

⑤.如果不是發生了很多驗證工作,緩存啟動了?是,沒有見過此查詢。否的話,啟動緩存。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

溆浦县| 手游| 若尔盖县| 赤峰市| 新泰市| 黄石市| 开化县| 海安县| 伽师县| 大理市| 明光市| 陇南市| 泗水县| 广东省| 秦皇岛市| 都兰县| 德安县| 呼图壁县| 无棣县| 大城县| 林口县| 正阳县| 平舆县| 阳朔县| 安仁县| 黄石市| 海盐县| 烟台市| 铁力市| 桃园县| 桂平市| 肥城市| 昌黎县| 石屏县| 赣州市| 灵石县| 五家渠市| 普安县| 黄山市| 江川县| 金乡县|