mysql 開發進階篇系列 17 MySQL Server(key_buffer與table_cache)

来源:https://www.cnblogs.com/MrHSR/archive/2018/08/08/9438447.html
-Advertisement-
Play Games

一.key_buffer 上一篇瞭解key_buffer設置,key_buffer_size指定了索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_read ...


一.key_buffer

  上一篇瞭解key_buffer設置,key_buffer_size指定了索引緩衝區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads /key_read_requests應該儘可能的低,至少是1:100,1:1000更好(理解為key_reads物理IO次數越少越好)。

--   一共有Key_read_requests個索引請求,一共發生了Key_reads次物理IO
SHOW GLOBAL STATUS LIKE '%key_read%';

--  Key_reads/Key_read_requests ≈ 0.1%以下比較好
SELECT 693206.0/94745304.0

  key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁碟表是MyISAM表,也要使用該值,可以使用檢查狀態值created_tmp_disk_tables得知詳情。

SHOW GLOBAL STATUS LIKE '%created_tmp_disk_tables%';

總結建議:

    對於1G記憶體的機器,如果不使用MyISAM表,推薦值是16M(8-64M)。
    單個key_buffer的大小不能超過4G。
    建議key_buffer設置為物理記憶體的1/4(針對MyISAM引擎),在很多情況下數據要比索引大得多。
    如果機器性能優越,可以設置多個key_buffer,分別讓不同的key_buffer來緩存專門的索引。
    Key_reads/Key_read_requests的大小正常情況下得小於0.01。

二. table_cache (table_open_cache)  

  上面講了索引緩存,這裡講表緩存 table_cache,在mysql 5.1之後叫做"table_open_cache"。這個參數表示資料庫用戶打開表的緩存數量(最大限制數),用於設置table高速緩存的數量。由於每個客戶端連接都會至少訪問一個表,因此此參數的值與max_connections有關。例如 對於200個並行運行的連接,應該讓表的緩存至少有200 * N。這裡N是可以執行的查詢的一個連接中表的最大數量(表數量)。
  表緩存機制是:當某一連接訪問一個表時,MySQL會檢查當前已緩存表的數量。如果該表已經在緩存中打開,則會直接訪問緩存中的表已加快查詢速度;如果該表未被緩存,則會將當前的表添加進緩存併進行查詢。
  在執行緩存操作之前,table_cache用於限制緩存表的最大數目:如果當前已經緩存的表未達到table_cache,則會將新表添加進來;若已經達到此值,MySQL將根據緩存表的最後查詢時間、查詢率等規則釋放之前的緩存(釋放機制與sqlserver一樣)。

-- 表緩存限制數(預設是2000次)
SHOW VARIABLES LIKE 'table_open_cache';    

  

-- 最大併發連接數
SHOW VARIABLES LIKE 'max_connections';

  

  可以通過檢查mysqld的狀態變數open_tables和opened_tables確定table_cache參數是否過小。 open_tables表示當前打開的表緩存數,如果執行flush tables操作,則系統會關閉一些當前沒有使用的表緩存,而使得些狀態值減小。opened_tables表示曾經打開的表緩存數(歷史的),會一直進行累加。執行flush tables值不會減少。

-- 當前打開的表緩存數
SHOW  GLOBAL STATUS LIKE 'open_tables';

  

-- 曾經打開的表緩存數
SHOW  GLOBAL STATUS LIKE 'opened_tables';

  
  2.1演示下open_tables和opened_tables值的變化(在另一臺mysql上進行)

     第一步:

-- 清空表緩存
FLUSH TABLES;
-- 查看值為1(代表當前連接)
SHOW  GLOBAL STATUS LIKE 'open_tables';

  

-- 歷史值為111
SHOW  GLOBAL STATUS LIKE 'opened_tables';

  
  第二步:

-- 執行一個查詢
SELECT COUNT(1) FROM User1
-- 再次查詢當前緩存數
SHOW  GLOBAL STATUS LIKE 'open_tables';

  

--歷史值也累加到113
SHOW  GLOBAL STATUS LIKE 'opened_tables';

  
  第三步:

-- 再執行一個相同查詢,  會發現值沒有增加,因為讀的是緩存。
SELECT COUNT(1) FROM User1
SHOW  GLOBAL STATUS LIKE 'open_tables';

  

SHOW  GLOBAL STATUS LIKE 'opened_tables';

  

三. 修改table_cache值      

  下麵來嘗試修改table_cache值, 還是一樣找到my.cnf
  [root@xuegod64 etc]# vim my.cnf
  

  [root@xuegod64 ~]# systemctl stop mysqld.service
  [root@xuegod64 ~]# /bin/systemctl start mysqld.service

-- 服務停止重啟後再次查看表緩存限制數。
SHOW VARIABLES LIKE 'table_open_cache';

  

四.table_cache總結

  open_tables是當前表緩存數,類似於sql server的邏輯查詢而非物理查詢。 該open_tables的值對設置table_cache值有重要的參考價值。
  如果Open_tables的值已經接近table_cache的值,且Opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_cache的值。下麵這台mysql伺服器正是這種情況,1990接近最大限制2000,且歷史值還在不斷變大。 如下圖:
  

  比較適合的值建議:

  Open_tables / Opened_tables >= 0.85

  當前mysql的值:SELECT 1990.0/3286078.0=0.00061

  Open_tables / table_cache <= 0.95

  當前mysql的值:1990.0/2000.0=0.99500


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

-Advertisement-
Play Games
更多相關文章
  • XFS文件系統簡介 維基百科關於XFS的簡介如下: XFS is a high-performance 64-bit journaling file system created by Silicon Graphics, Inc (SGI) in 1993.[6] It was the defaul... ...
  • 預設的Centos6.5 glibc版本最高為2.12, 而在進行Nodejs開發時項目所依賴的包往往需要更高版本的glibc庫支持, 因此在不升級系統的前提下, 需要主動更新系統glibc庫. 一般遇到錯誤libc.so.6: version GLIBC_2.14 not found時表示需要對g ...
  • 之前租的伺服器沒有中文亂碼的問題,最近重裝了一下系統, 出現了中文亂碼, 以下是解決方案: 輸入locale查看當前的語言是否是中文 如果不是, 輸入添加中文字元集: 還可以 查看本地安裝的語言包有哪些: 接著 輸入 修改內容為(原內容最好註釋掉別刪): 保存退出並使該文件立即生效執行如下命令: 完 ...
  • DNS(Domain Name System,功能變數名稱系統),網際網路上作為功能變數名稱和IP地址相互映射的一個分散式資料庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。 查看dns 可以使用 /etc/resolv.conf 文件,nslookup 命令 和 dig 命令: 配置 d ...
  • 1 海量數據的存儲問題 如今隨著互聯網的發展,數據的量級也是撐指數的增長,從GB到TB到PB。對數據的各種操作也是愈加的困難,傳統的關係性資料庫已經無法滿足快速查詢與插入數據的需求。這個時候NoSQL的出現暫時解決了這一危機。它通過降低數據的安全性,減少對事務的支持,減少對複雜查詢的支持,來獲取性能 ...
  • 占座 ...
  • [20180808]exists and not exists.txt--//生產系統遇到的一個性能問題,通過例子來說明:1.環境:SCOTT@test01p> @ ver1PORT_STRING VERSION BANNER CON_ID IBMPC/WIN_NT64-9.1.0 12.1.0.1 ...
  • 一、基本概念 1.資料庫: 資料庫(DataBase)就是一個存儲數據的倉庫,為了方便數據的存儲和管理,它將數據按照特定的規律存儲在磁碟上。通過資料庫管理系統,可以有效的組織和管理存儲在資料庫中的數據。資料庫是數據管理軟體。數據存儲分為三個階段:人工管理階段、文件系統階段和資料庫系統階段。 2.數據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...