MySQL緩存機制詳解(一)

来源:http://www.cnblogs.com/gdsblog/archive/2017/08/24/7420997.html
-Advertisement-
Play Games

本文章拿來學慣用||參考資料:http://www.2cto.com/database/201308/236361.html 對MySql查詢緩存及SQL Server過程緩存的理解及總結 一、MySql的Query Cache 1、Query Cache MySQL Query Cache是用來緩 ...




 

本文章拿來學慣用||參考資料:http://www.2cto.com/database/201308/236361.html

對MySql查詢緩存及SQL Server過程緩存的理解及總結   一、MySql的Query Cache   1、Query Cache   MySQL Query Cache是用來緩存我們所執行的SELECT語句以及該語句的結果集。MySql在實現Query Cache的具體技術細節上類似典型的KV存儲,就是將SELECT語句和該查詢語句的結果集做了一個HASH映射並保存在一定的記憶體區域中。當客戶端發起SQL查詢時,Query Cache的查找邏輯是,先對SQL進行相應的許可權驗證,接著就通過Query Cache來查找結果。它不需要經過Optimizer模塊進行執行計劃的分析優化,更不需要發生同任何存儲引擎的交互,減少了大量的磁碟IO和CPU運算,所以有時候效率非常高。   2、Query Cache設置參數   可以通過調整 MySQL的參數打開並設置它的Query Cache功能,主要有以下5個參數:   (1)、query_cache_limit:允許緩存的單條查詢結果集的最大容量,預設是1MB,超過此參數設置的查詢結果集將不會被緩存; (2)、query_cache_min_res_unit:設置查詢緩存Query Cache每次分配記憶體的最小空間大小,即每個查詢的緩存最小占用的記憶體空間大小; (3)、query_cache_size:設置 Query Cache 所使用的記憶體大小,預設值為0,大小必須是1024的整數倍,如果不是整數倍,MySQL 會自動調整降低最小量以達到1024的倍數; (4)、query_cache_type:控制 Query Cache 功能的開關,可以設置為0、1、2三種,意義分別如下:   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。 (5)、query_cache_wlock_invalidate:控制當有寫鎖定發生在表上的時刻是否先失效該表相關的Query Cache,如果設置為 1(TRUE),則在寫鎖定的同時將失效該表相關的所有Query Cache,如果設置為0(FALSE)則在鎖定時刻仍然允許讀取該表相關的Query Cache。   3、Query Cache和性能   任何事情過猶不及,尤其對於某些寫頻繁的系統,開啟Query Cache功能可能並不能讓系統性能有提升,有時反而會有下降。原因是MySql為了保證Query Cache緩存的內容和實際數據絕對一致,當某個數據表發生了更新、刪除及插入操作,MySql都會強制使所有引用到該表的查詢SQL的Query Cache失效。對於密集寫操作,啟用查詢緩存後很可能造成頻繁的緩存失效,間接引發記憶體激增及CPU飆升,對已經非常忙碌的資料庫系統這是一種極大的負擔。   4、其他   Query Cache因MySql的存儲引擎不同而實現略有差異,比如MyISAM,緩存的結果集存儲在OS Cache中,而最流行的InnoDB則放在Buffer Pool中。       二、SQL Server的Procedure Cache   SQL Server沒有類似MySql的Query Cache機制,但是它有自己的緩存機制。SQL Server不會簡單直接地緩存SQL查詢結果集,而是緩存它所讀取過的查詢數據頁(數據緩存Data Buffer),同時它還緩存執行計劃(過程緩存Procedure Cache),下麵就談談我們所熟知的過程緩存。   1、SQL執行過程   SQL語句在執行前首先需要被編譯,接著需要通過SQL Server查詢引擎進行優化,然後得到優化後的執行計劃,最後SQL按照執行計劃被執行。   2、過程緩存(Procedure Cache)   創建執行計劃會占用CPU資源,當執行計劃被創建後,SQL Server查詢引擎預設會自動緩存執行計劃。   對於整體相似,僅僅是參數不同的SQL語句,SQL Server可以重用緩存的執行計劃。   但對於不同的SQL語句,SQL Server並不能重覆使用以前的執行計劃,而需要重新編譯出一個新的執行計劃,因為SQL Server查詢引擎會自動緩存執行計劃,每一個新的執行計劃都會占用SQL Server的記憶體。   在SQL Server可用記憶體足夠使用的情況下,查詢引擎並不主動清除以前保存的查詢計劃。所以,某些情況下,一條相似的SQL語句,僅僅因為寫法不同,而憑空多出了很多執行計劃,對於相似的SQL,這些多餘的執行計劃白白地占據著記憶體,大大影響SQL Server中緩存的查詢計劃數目。   對於上面這種情況,如果限定了SQL Server最大可用記憶體,它將導致SQL Server可用記憶體減少,從而在執行查詢時尤其是大的數據查詢時與磁碟發生更多的記憶體頁交換;如果沒有設置最大可用記憶體,則SQL Server由於緩存了太多執行計劃,從而使記憶體占用過大。   3、如何減少過程緩存 對於減少過程緩存的占用,主要是可以通過使用參數化查詢。   參數化查詢的關鍵是查詢優化器將創建一個可以重用的緩存計劃(SQL Server查詢優化器將查詢重新編寫為一個參數化SQL語句),這個可重用的緩存計劃消除了對這些類似SQL語句的每一次執行都創建一個緩存計劃的需求。通過創建一個可重用計劃,SQL Server就減少了存放類似的執行計劃所需的記憶體使用。   對於開發人員,我們一般可以通過下麵兩種方式實現參數化查詢:   (1)、使用存儲過程執行SQL語句;   (2)、使用sp_executesql 方式執行SQL語句。   關於使用存儲過程執行SQL,再說句題外話:對於存儲過程一直以來有頗多爭議,比如ORM派認為存儲過程是完全面向過程的不易擴展不易維護的等等等等。根據我個人的開發經驗,簡單的幾乎沒有邏輯的存儲過程我建議多用,但是複雜的存儲過程一直以來都是BUG集中營,而且後期維護成本奇高(聽我司架構師講過,某重要業務系統的資料庫有個八千多行的存儲過程,兩百多個變數,沒有人敢動),邏輯最好通過應對劇烈變化的業務邏輯層來寫。現在我們有了成熟的ORM,還有分層,開發中要絕對避免寫過長且邏輯複雜的存儲過程,否則面對變化,日積月累再出現幾個八千行的存儲過程也不是沒有可能。

 

對MySql查詢緩存及SQL Server過程緩存的理解及總結   一、MySql的Query Cache   1、Query Cache   MySQL Query Cache是用來緩存我們所執行的SELECT語句以及該語句的結果集。MySql在實現Query Cache的具體技術細節上類似典型的KV存儲,就是將SELECT語句和該查詢語句的結果集做了一個HASH映射並保存在一定的記憶體區域中。當客戶端發起SQL查詢時,Query Cache的查找邏輯是,先對SQL進行相應的許可權驗證,接著就通過Query Cache來查找結果。它不需要經過Optimizer模塊進行執行計劃的分析優化,更不需要發生同任何存儲引擎的交互,減少了大量的磁碟IO和CPU運算,所以有時候效率非常高。   2、Query Cache設置參數   可以通過調整 MySQL的參數打開並設置它的Query Cache功能,主要有以下5個參數:   (1)、query_cache_limit:允許緩存的單條查詢結果集的最大容量,預設是1MB,超過此參數設置的查詢結果集將不會被緩存; (2)、query_cache_min_res_unit:設置查詢緩存Query Cache每次分配記憶體的最小空間大小,即每個查詢的緩存最小占用的記憶體空間大小; (3)、query_cache_size:設置 Query Cache 所使用的記憶體大小,預設值為0,大小必須是1024的整數倍,如果不是整數倍,MySQL 會自動調整降低最小量以達到1024的倍數; (4)、query_cache_type:控制 Query Cache 功能的開關,可以設置為0、1、2三種,意義分別如下:   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。 (5)、query_cache_wlock_invalidate:控制當有寫鎖定發生在表上的時刻是否先失效該表相關的Query Cache,如果設置為 1(TRUE),則在寫鎖定的同時將失效該表相關的所有Query Cache,如果設置為0(FALSE)則在鎖定時刻仍然允許讀取該表相關的Query Cache。   3、Query Cache和性能   任何事情過猶不及,尤其對於某些寫頻繁的系統,開啟Query Cache功能可能並不能讓系統性能有提升,有時反而會有下降。原因是MySql為了保證Query Cache緩存的內容和實際數據絕對一致,當某個數據表發生了更新、刪除及插入操作,MySql都會強制使所有引用到該表的查詢SQL的Query Cache失效。對於密集寫操作,啟用查詢緩存後很可能造成頻繁的緩存失效,間接引發記憶體激增及CPU飆升,對已經非常忙碌的資料庫系統這是一種極大的負擔。   4、其他   Query Cache因MySql的存儲引擎不同而實現略有差異,比如MyISAM,緩存的結果集存儲在OS Cache中,而最流行的InnoDB則放在Buffer Pool中。       二、SQL Server的Procedure Cache   SQL Server沒有類似MySql的Query Cache機制,但是它有自己的緩存機制。SQL Server不會簡單直接地緩存SQL查詢結果集,而是緩存它所讀取過的查詢數據頁(數據緩存Data Buffer),同時它還緩存執行計劃(過程緩存Procedure Cache),下麵就談談我們所熟知的過程緩存。   1、SQL執行過程   SQL語句在執行前首先需要被編譯,接著需要通過SQL Server查詢引擎進行優化,然後得到優化後的執行計劃,最後SQL按照執行計劃被執行。   2、過程緩存(Procedure Cache)   創建執行計劃會占用CPU資源,當執行計劃被創建後,SQL Server查詢引擎預設會自動緩存執行計劃。   對於整體相似,僅僅是參數不同的SQL語句,SQL Server可以重用緩存的執行計劃。   但對於不同的SQL語句,SQL Server並不能重覆使用以前的執行計劃,而需要重新編譯出一個新的執行計劃,因為SQL Server查詢引擎會自動緩存執行計劃,每一個新的執行計劃都會占用SQL Server的記憶體。   在SQL Server可用記憶體足夠使用的情況下,查詢引擎並不主動清除以前保存的查詢計劃。所以,某些情況下,一條相似的SQL語句,僅僅因為寫法不同,而憑空多出了很多執行計劃,對於相似的SQL,這些多餘的執行計劃白白地占據著記憶體,大大影響SQL Server中緩存的查詢計劃數目。   對於上面這種情況,如果限定了SQL Server最大可用記憶體,它將導致SQL Server可用記憶體減少,從而在執行查詢時尤其是大的數據查詢時與磁碟發生更多的記憶體頁交換;如果沒有設置最大可用記憶體,則SQL Server由於緩存了太多執行計劃,從而使記憶體占用過大。   3、如何減少過程緩存 對於減少過程緩存的占用,主要是可以通過使用參數化查詢。   參數化查詢的關鍵是查詢優化器將創建一個可以重用的緩存計劃(SQL Server查詢優化器將查詢重新編寫為一個參數化SQL語句),這個可重用的緩存計劃消除了對這些類似SQL語句的每一次執行都創建一個緩存計劃的需求。通過創建一個可重用計劃,SQL Server就減少了存放類似的執行計劃所需的記憶體使用。   對於開發人員,我們一般可以通過下麵兩種方式實現參數化查詢:   (1)、使用存儲過程執行SQL語句;   (2)、使用sp_executesql 方式執行SQL語句。   關於使用存儲過程執行SQL,再說句題外話:對於存儲過程一直以來有頗多爭議,比如ORM派認為存儲過程是完全面向過程的不易擴展不易維護的等等等等。根據我個人的開發經驗,簡單的幾乎沒有邏輯的存儲過程我建議多用,但是複雜的存儲過程一直以來都是BUG集中營,而且後期維護成本奇高(聽我司架構師講過,某重要業務系統的資料庫有個八千多行的存儲過程,兩百多個變數,沒有人敢動),邏輯最好通過應對劇烈變化的業務邏輯層來寫。現在我們有了成熟的ORM,還有分層,開發中要絕對避免寫過長且邏輯複雜的存儲過程,否則面對變化,日積月累再出現幾個八千行的存儲過程也不是沒有可能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在MySQL中如何給普通用戶授予查看所有用戶線程/連接的許可權,當然,預設情況下show processlist是可以查看當前用戶的線程/連接的。 mysql> grant process on MyDB.* to test; ERROR 1221 (HY000): Incorrect usage o... ...
  • 具體報錯如下: Table '.\mysql\proc' is marked as crashed and should be repaired 我的解決辦法: 找到mysql的安裝目錄的bin/myisamchk工具,右擊【以管理員身份運行】修複下即可。 網上解決辦法: 找到mysql的安裝目錄的 ...
  • ALTER PROCEDURE [dbo].[sp_GetClassCountData] @BatchId NVARCHAR(50), @ExamId VARCHAR(100), @ClassId VARCHAR(100), @SubjectId NVARCHAR(50)ASBEGIN DECLAR ...
  • [20170824]11G備庫啟用DRCP連接.txt--//參考鏈接:http://blog.itpub.net/267265/viewspace-2099397/blogs.oracle.com/database4cn/adg%e5%a4%87%e5%ba%93%e7%9a%84drcp%e8% ...
  • 概述: 視圖即是虛擬表,也稱為派生表,因為它們的內容都派生自其它表的查詢結果。雖然視圖看起來感覺和基本表一樣,但是它們不是基本表。基本表的內容是持久的,而視圖的內容是在使用過程中動態產生的。——摘自《SQLite權威指南》 使用視圖的優點: 1.可靠的安全性 2.查詢性能提高 3.有效應對靈活性的功 ...
  • 創建序列 create sequence seq_student start with 6 increment by 1 maxvalue 500 nominvalue nocycle nocache; 創建觸發器 create or replace trigger trigger_student ... ...
  • HDFS ,Hadoop Distribute File System,hadoop分散式文件系統。 主從架構,分主節點NameNode,從節點DataNode.當然還有個SecondaryName,但這不是淺析里的點.這裡主要講下namenode和datanode的基本概念, 並描述下讀寫過程. ...
  • 生成式對抗網路(gennerative adversarial network,GAN),谷歌2014年提出網路模型。靈感自二人博弈的零和博弈,目前最火的非監督深度學習。GAN之父,Ian J.Goodfellow,公認人工智慧頂級專家。 原理。生成式對搞網路包含一個生成模型(generative ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...