最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題

 更新時間:2023年05月28日 14:31:35   作者:技術王老五  
本文主要介紹了MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

對接多個外部接口,需要保存請求參數(shù)以及返回參數(shù),方便消息的補償,因為多個外部接口,多個接口字段都不統(tǒng)一,整體使用一個大字段(longtext)進行存儲,但是當數(shù)據(jù)只有40w的時候查詢速度就非常慢長達40s左右。

CREATE TABLE `risk_request_log_bak` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `risk_buss_no` varchar(32) DEFAULT NULL COMMENT '',
  `buss_no` varchar(32) DEFAULT NULL COMMENT '',
  `buss_order_no` varchar(32) DEFAULT NULL COMMENT '',
  `server_name` varchar(30) DEFAULT NULL COMMENT '',
  `url` varchar(500) DEFAULT NULL COMMENT '',
  `interface_code` varchar(10) DEFAULT NULL COMMENT '',
  `request_msg` longtext COMMENT '請求參數(shù)體',
  `response_msg` longtext COMMENT '響應參數(shù)體',
  `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
  `remark` varchar(50) DEFAULT NULL COMMENT '',
  `resp_time` datetime DEFAULT NULL COMMENT '響應時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=451029 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='接';

萬金油的策略加索引,需要查詢的字段risk_buss_no上添加索引,速度由原來的5min以上,變?yōu)閹装賛s

思考:

40w的數(shù)據(jù)就算不加索引查詢的時間40s左右也是不正常的。

嘗試:

  •   `request_msg` longtext COMMENT '請求參數(shù)體',
  •   `response_msg` longtext COMMENT '響應參數(shù)體'

這兩個字段設置成64位的數(shù)據(jù)之后,查詢效率明顯提升

原因:

為了清楚大字段對性能的影響,我們必須要知道innodb存儲引擎在底層對行的處理方式:

知識點一:在5.1中,innodb存儲引擎的默認的行格式為compact(redundant為兼容以前的版本),對于blob,text,varchar(8099)這樣的大字段,innodb只會存放前768字節(jié)在數(shù)據(jù)頁中,而剩余的數(shù)據(jù)則會存儲在溢出段中(發(fā)生溢出情況的時候適用,不溢出的時候就全都存在數(shù)據(jù)行里);

知識點二:innodb的塊大小默認為16kb,由于innodb存儲引擎表為索引組織表,樹底層的葉子節(jié)點為一雙向鏈表,因此每個頁中至少應該有兩行記錄,這就決定了innodb在存儲一行數(shù)據(jù)的時候不能夠超過8k(8098字節(jié));

知識點三:使用了blob數(shù)據(jù)類型,是不是一定就會存放在溢出段中?通常我們認為blob,clob這類的大對象的存儲會把數(shù)據(jù)存放在數(shù)據(jù)頁之外,其實不然,關鍵點還是要看一個page中到底能否存放兩行數(shù)據(jù),blob可以完全存放在數(shù)據(jù)頁中(單行長度沒有超過8098字節(jié)),而varchar類型的也有可能存放在溢出頁中(單行長度超過8098字節(jié),前768字節(jié)存放在數(shù)據(jù)頁中);

知識點四:5.1中的innodb_plugin引入了新的文件格式:barracuda(將compact和redundant合稱為antelope),該文件格式擁有新的兩種行格式:compressed和dynamic,兩種格式對blob字段采用完全溢出的方式,數(shù)據(jù)頁中只存放20字節(jié),其余的都存放在溢出段中:

知識點五:mysql在操作數(shù)據(jù)的時候,以page為單位,不管是更新,插入,刪除一行數(shù)據(jù),都需要將那行數(shù)據(jù)所在的page讀到內(nèi)存中,然后在進行操作,這樣就存在一個命中率的問題,如果一個page中能夠相對的存放足夠多的行,那么命中率就會相對高一些,性能就會有提升;

查詢一下字段的長度:

可以知道這個字段的平均長度大約在2.5kb

查看一下mysql的row_format

根據(jù)知識點四可以知道:數(shù)據(jù)頁中只存放20字節(jié),其余的都存放在溢出段中

實際:

1、innodb的data page默認是16K,在新數(shù)據(jù)寫入的時候,會預留1/16的空間,用于后續(xù)的新紀錄寫入,減少頻繁的新增怕個的開銷

2、每個data page,至少要存儲2行,因此理論上行的最大長度是8K,實際上因為因為一些的innodb內(nèi)部數(shù)據(jù)結(jié)構導致每行要小于8K

3、結(jié)合上面的兩點,為了保障良好的順序?qū)懭?,每個innodb最好有個自增的id,而且一個page頁最好的填充率是1/2到15/16

4、當page少于兩行,innodb會進行收縮,盡可能的釋放空間,最主要的兩種就是上面的知識點一和知識點四

結(jié)合上面的4點,我們知道一行的最大長度是2.5K遠遠小于8K,所以大字段的數(shù)據(jù)都會存到數(shù)據(jù)段中,而不會溢出到off page中,因此我們可以看出主要是由于大字段緩存到data page中,內(nèi)存利用率很差,造成了大量的隨機讀。

主要的應對策略:

1、拆表,將大字段拆到另一個表中

2、索引,從訪問密度較小的數(shù)據(jù)頁改為訪問密度很大的索引頁,隨機io轉(zhuǎn)換為順序io,同時內(nèi)存命中率大大提升;

總結(jié):核心思想是讓單個page能夠存放足夠多的行,不斷的提示內(nèi)存的命中率

到此這篇關于MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問題的文章就介紹到這了,更多相關MySQL大字段longtext、text內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql中如何實現(xiàn)兩列的值互換

    Mysql中如何實現(xiàn)兩列的值互換

    這篇文章主要來和大家探討一下Mysql中如何實現(xiàn)兩列的值互換,文中為大家提供了一些常用的方法,希望對大家有一定的幫助
    2024-11-11
  • MySQL REVOKE實現(xiàn)刪除用戶權限

    MySQL REVOKE實現(xiàn)刪除用戶權限

    在 MySQL 中,可以使用 REVOKE 語句刪除某個用戶的某些權限,本文就詳細的來介紹一下REVOKE 的具體使用方法,感興趣的可以了解一下
    2021-06-06
  • MySQL Replace INTO的使用

    MySQL Replace INTO的使用

    今天DST里面有個插件作者問我關于Replace INTO和INSERT INTO的區(qū)別,我和他說晚上上我的blog看吧,那時候還在忙,現(xiàn)在從MYSQL手冊里找了點東西,MYSQL手冊里說REPLACE INTO說的還是比較詳細的.
    2008-04-04
  • Mysql索引詳細介紹

    Mysql索引詳細介紹

    這篇文章主要介紹了Mysql索引詳細介紹,本文講解了Mysql索引簡介、設計索引的原則、如何使用索引等內(nèi)容,需要的朋友可以參考下
    2014-07-07
  • MySQL存儲過程例子(包含事務,輸出參數(shù),嵌套調(diào)用)

    MySQL存儲過程例子(包含事務,輸出參數(shù),嵌套調(diào)用)

    MySQL存儲過程例子,包含事務,輸出參數(shù),嵌套調(diào)用,學習mysql存儲過程的朋友可以參考下。
    2010-09-09
  • 使用Visual Studio Code連接MySql數(shù)據(jù)庫并進行查詢

    使用Visual Studio Code連接MySql數(shù)據(jù)庫并進行查詢

    這篇文章主要介紹了使用Visual Studio Code連接MySql數(shù)據(jù)庫并進行查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • MySQL分頁查詢的三種常用方法

    MySQL分頁查詢的三種常用方法

    在處理數(shù)據(jù)庫查詢時,我們經(jīng)常需要對結(jié)果進行分頁,以便在用戶界面上提供更好的瀏覽體驗,本文主要介紹了MySQL分頁查詢的三種常用方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Mysql查詢時間區(qū)間日期列表實例代碼

    Mysql查詢時間區(qū)間日期列表實例代碼

    最近常用到mysql的日期范圍搜索,下面這篇文章主要給大家介紹了關于Mysql查詢時間區(qū)間日期列表的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • MySQL root賬號遠程新建數(shù)據(jù)庫報錯1044問題及解決方法

    MySQL root賬號遠程新建數(shù)據(jù)庫報錯1044問題及解決方法

    這篇文章主要介紹了MySQL root賬號遠程新建數(shù)據(jù)庫報錯1044問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • MySQL中的數(shù)據(jù)庫約束用法及說明

    MySQL中的數(shù)據(jù)庫約束用法及說明

    本文介紹了MySQL數(shù)據(jù)庫中的約束類型,包括notnull、unique、default、primary key、foreign key和check,這些約束類型用于實現(xiàn)對插入數(shù)據(jù)的管控,確保數(shù)據(jù)的完整性和邏輯性
    2026-03-03

最新評論

黑河市| 织金县| 鄄城县| 平顺县| 南涧| 清河县| 丰城市| 毕节市| 筠连县| 文化| 乐都县| 阳东县| 襄汾县| 阳信县| 乃东县| 凯里市| 新宁县| 台南县| 定远县| 岱山县| 集贤县| 运城市| 清徐县| 林州市| 兴义市| 崇信县| 固阳县| 威远县| 方城县| 五华县| 唐山市| 宁化县| 平乡县| 青田县| 开原市| 晴隆县| 天柱县| 响水县| 青海省| 永嘉县| 凌源市|