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

MySQL 表空間碎片的概念及相關(guān)問題解決

 更新時間:2021年05月07日 11:53:31   作者:王文安  
這篇文章主要介紹了MySQL 表空間碎片的概念及相關(guān)問題解決,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

背景

經(jīng)常使用 MySQL 的話,會發(fā)現(xiàn) MySQL 數(shù)據(jù)文件的磁盤空間一般會不停的增長,而且有時候刪了數(shù)據(jù)或者插入一批數(shù)據(jù)的時候,磁盤空間有時候還會毫無變化。引發(fā)這個其妙現(xiàn)象的就是 MySQL 的表空間碎片。

什么是表空間碎片?

表空間碎片指的是表空間中存在碎片,形象一點來比喻的話,就像是一張 A4 紙,“表空間碎片”就像是把這張 A4 紙撕碎,再重新拼起來,各個碎片之間都會有一些縫隙存在,這些縫隙就是“表空間碎片”。重新拼起來的碎片實際上會比完整的 A4 紙大上一圈,這也代表著表空間容易引發(fā)的問題:空間浪費。

對于背景中描述的現(xiàn)象,可以用一張圖來進行解釋:

圖中的數(shù)字代表真實的數(shù)據(jù)行,圓角矩形代表一個表的表空間。從左往右,第一次操作是刪除數(shù)據(jù),由于 MySQL 在設(shè)計上是不會主動釋放空間的,因此當(dāng)表中的數(shù)據(jù)行被刪除時,雖然數(shù)據(jù)被“刪除”了,但是實際上這部分空間是沒有釋放的,依舊會被 Table A 占用,因此也就出現(xiàn)了這樣子的情景:刪除了日志表的很多數(shù)據(jù),但是 MySQL 的磁盤空間并沒有降低。

PS:這種不釋放空間的設(shè)計多半和惰性刪除有關(guān),早期設(shè)計數(shù)據(jù)庫時,使用的 IO 設(shè)備一般是機械盤,讀寫性能比 SSD 差很多,所以刪除操作一般不會直接觸發(fā)磁盤上的數(shù)據(jù)刪除。

可以看到數(shù)據(jù)刪除之后,原本連續(xù)的空間中出現(xiàn)了兩個空白的區(qū)域,這種一般就叫做表空間空洞,空洞太多了就叫做表空間碎片化(對應(yīng)的是表空間連續(xù))。這部分的空間雖然不會釋放,但是會被標(biāo)記為可重復(fù)利用,參考最右邊的表空間示意圖(第三個圓角矩形),當(dāng)新插入數(shù)據(jù)的時候新數(shù)據(jù)會重新寫入到表空間空洞中,這也代表著:在大規(guī)模刪除過數(shù)據(jù)的表上,寫入數(shù)據(jù)時,表空間可能不會明顯增長或者不會增長。

實際上產(chǎn)生表空間空洞的操作并不只有 delete,update 也會引起這個問題,比如在 varchar 這種變長的字符型列中修改數(shù)據(jù),改短一些的時候就會出現(xiàn)非常小的空洞,改長的話就有可能會因為空間不足導(dǎo)致把數(shù)據(jù)行的一些數(shù)據(jù)遷移到其他地方去。

怎么查看表空間碎片

MySQL 的系統(tǒng)表記錄了表空間的使用情況,可以用如下查詢檢查:

SELECT CONCAT(table_schema,'.',table_name) AS 'table_name',
                table_rows AS 'Number of Rows',
                CONCAT(ROUND(data_length/(1024*1024),2),' M') AS 'data_size',
                CONCAT(ROUND(index_length/(1024*1024),2),' M') AS 'index_size' ,
                CONCAT(ROUND(data_free/(1024*1024),2),' M') AS'data_free',
                CONCAT(ROUND(data_free/data_length,2),' %') AS 'data_free_pct',
                ENGINE as 'engine'
FROM information_schema.TABLES
WHERE table_schema = 'tablename' 
ORDER by data_free desc;

data_free 指表空間碎片的總空間大小,data_free_pct 指這個表的碎片百分比,效果如下:

mysql> SELECT CONCAT(table_schema,'.',table_name) AS 'table_name',
    ->                 table_rows AS 'Number of Rows',
    ->                 CONCAT(ROUND(data_length/(1024*1024),2),' M') AS 'data_size',
    ->                 CONCAT(ROUND(index_length/(1024*1024),2),' M') AS 'index_size' ,
    ->                 CONCAT(ROUND(data_free/(1024*1024),2),' M') AS'data_free',
    ->                 CONCAT(ROUND(data_free/data_length,2),' %') AS 'data_free_pct',
    ->                 ENGINE as 'engine'
    -> FROM information_schema.TABLES
    -> WHERE table_schema = 'sbtest'
    -> ORDER by data_free desc;
+----------------+----------------+-----------+------------+-----------+---------------+--------+
| table_name     | Number of Rows | data_size | index_size | data_free | data_free_pct | engine |
+----------------+----------------+-----------+------------+-----------+---------------+--------+
| sbtest.sbtest5 |              0 | 0.02 M    | 0.00 M     | 44.00 M   | 2816.00 %     | InnoDB |
| sbtest.sbtest4 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB |
| sbtest.sbtest3 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB |
| sbtest.sbtest2 |         986400 | 214.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB |
| sbtest.sbtest1 |         987400 | 199.70 M  | 15.52 M    | 4.00 M    | 0.02 %        | InnoDB |
+----------------+----------------+-----------+------------+-----------+---------------+--------+
5 rows in set (0.00 sec)

第一行數(shù)據(jù)是測試用的數(shù)據(jù),表中的所有數(shù)據(jù)都被刪掉了,因此計算出來的 data_free_pct 超過了 100%。

怎么解決表空間碎片問題

目前,能夠回收表空間的辦法僅有一個,就是重建表,手段包括但不限于 optimize,alter table 等。alter table 的有些操作只能靠 rebuild 表來完成,所以有時候?qū)Υ蟊磉M行一些維護操作之后,也會看到磁盤空間使用率下降,這就是回收了表空間碎片騰出來的那一部分空間。

從一般經(jīng)驗來看,表空間碎片的回收操作不建議經(jīng)常執(zhí)行,每個月一次就足夠了,因為 rebuild 表對服務(wù)器的資源影響會比較大,且會影響這個表的寫入操作。碎片率(data_free_pct)低于 20% 的時候也不用特別在意,除非磁盤空間非常緊張,且日志基本被清空。

對于回收空間的問題

對一些日志表,或者是有區(qū)域性特征的表,建議使用 MySQL 的分區(qū)表來管理,需要清理一批數(shù)據(jù)的時候,可以用 partition truncate 的方式進行清理,磁盤空間也能直接釋放掉。

以上就是MySQL 表空間碎片的概念及相關(guān)問題解決的詳細內(nèi)容,更多關(guān)于MySQL 表空間碎片的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql主鍵id的生成方式(自增、唯一不規(guī)則)

    mysql主鍵id的生成方式(自增、唯一不規(guī)則)

    本文主要介紹了mysql主鍵id的生成方式,主要包括兩種生成方式,文中通過代碼示例介紹的非常詳細,感興趣的可以了解一下
    2021-09-09
  • mysql自定義函數(shù)原理與用法實例分析

    mysql自定義函數(shù)原理與用法實例分析

    這篇文章主要介紹了mysql自定義函數(shù),結(jié)合實例形式分析了mysql自定義函數(shù)基本功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • MySQL數(shù)據(jù)庫學(xué)習(xí)之排序與單行處理函數(shù)詳解

    MySQL數(shù)據(jù)庫學(xué)習(xí)之排序與單行處理函數(shù)詳解

    這篇文章主要為大家詳細介紹一下MySQL數(shù)據(jù)庫中排序與單行處理函數(shù)的使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • MySQL NULL 值處理實例詳解

    MySQL NULL 值處理實例詳解

    這篇文章主要介紹了MySQL NULL 值處理實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • mysql存儲過程之錯誤處理實例詳解

    mysql存儲過程之錯誤處理實例詳解

    這篇文章主要介紹了mysql存儲過程之錯誤處理,結(jié)合實例形式詳細分析了mysql存儲過程錯誤處理相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2019-12-12
  • MySQL正則表達式REGEXP使用詳解

    MySQL正則表達式REGEXP使用詳解

    MySQL中正則表達式通常被用來檢索或替換符合某個模式的文本內(nèi)容,根據(jù)指定的匹配模式匹配文中符合要求的特殊字符串,下面這篇文章主要給大家介紹了關(guān)于MySQL正則表達式REGEXP使用的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 淺談mysql雙層not exists查詢執(zhí)行流程

    淺談mysql雙層not exists查詢執(zhí)行流程

    本文主要介紹了淺談mysql雙層not?exists查詢執(zhí)行流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • mysql通過查看跟蹤日志跟蹤執(zhí)行的sql語句

    mysql通過查看跟蹤日志跟蹤執(zhí)行的sql語句

    在SQL SERVER下跟蹤sql采用事件探查器,而在mysql下如何跟蹤sql呢,下面有個不錯的方法,大家可以參考下
    2014-01-01
  • 分享MySQL的自動化安裝部署的方法

    分享MySQL的自動化安裝部署的方法

    線上的MySQL一般都采用源碼編譯,雖然MySQL的源碼編譯挺簡單的,但是試想一下,如果你有幾百臺服務(wù)器同時要安裝MySQL,難道你還一臺臺去手動編譯、編寫配置文件嗎?這顯然太低效了,本文討論MySQL的自動化安裝部署。
    2014-07-07
  • 使用Canal實現(xiàn)MySQL主從同步的流程步驟

    使用Canal實現(xiàn)MySQL主從同步的流程步驟

    這篇文章主要介紹了如何使用Canal實現(xiàn)MySQL主從同步效果,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04

最新評論

南江县| 永昌县| 平江县| 农安县| 尚义县| 横峰县| 柘荣县| 通江县| 嘉鱼县| 长岛县| 北票市| 新乡县| 天台县| 临沭县| 长岭县| 定陶县| 承德县| 壤塘县| 三江| 惠来县| 繁峙县| 百色市| 鄂托克前旗| 芒康县| 岑溪市| 神农架林区| 南城县| 阿巴嘎旗| 图们市| 无锡市| 兴和县| 富平县| 哈巴河县| 合水县| 石棉县| 淮南市| 弥渡县| 夏邑县| 堆龙德庆县| 吉林省| 商河县|