1. 程式人生 > >MySQL的 data_free,表碎片整理

MySQL的 data_free,表碎片整理

在MySQL中,我們經常會使用VARCHARTEXTBLOB等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——MySQL資料表碎片整理。
每當MySQL從你的列表中刪除了一行內容,該段空間就會被留空。而在一段時間內的大量刪除操作,會使這種留空的空間變得比儲存列表內容所使用的空間更大。
當MySQL對資料進行掃描時,它掃描的物件實際是列表的容量需求上限,也就是資料被寫入的區域中處於峰值位置的部分。如果進行新的插入操作,MySQL將嘗試利用這些留空的區域,但仍然無法將其徹底佔用。

1.或者檢視某個表所佔空間,以及碎片大小。

select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from information_schema.tables where TABLE_SCHEMA='db002';
或者

select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from information_schema.tables where TABLE_SCHEMA='db002' and data_free !=0;


--注意:如果是共享表空間的話, data_free 表示共享表空間的大小而非資料的大小。如果是獨享表空間才是該表的剩餘空間。

如:我的表空間檔案一共才136G,下面的幾個表的data_free都是120多G:

mysql> select table_schema,table_name,data_free,data_length,index_length FROM  information_schema.TABLES where data_free !=0;
+--------------+------------------------------+--------------+-------------+--------------+
| table_schema | table_name                   | data_free    | data_length | index_length |
+--------------+------------------------------+--------------+-------------+--------------+
| eip_partner  | TASK_AUDIT_PARAM             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_AUDIT_TOTAL             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_PENDING_LOG             | 124129378304 |       16384 |            0 | 
| eip_partner  | TASK_READING_LOG             | 124129378304 |       16384 |            0 | 
2、整理表的碎片
optimize table aaa_safe,aaa_user,t_platform_user,t_user;


提示該表不支援 optimize,但是下邊有顯示OK.其實已經執行成功了。5.6.X的版本,其實已經支援Innodb了。
整理完畢


針對以前版本:
大致意思是說innodb的資料庫不支援optimize,可以用 
ALTER TABLE table.name ENGINE='InnoDB'; 
該方法會對舊錶以複製的方式新建一個新表,然後刪除舊錶。雖然這個過程是安全的,但是在進行操作時還是先進行備份為好 

也可以在啟動資料庫的時候指定--skip-new或者--safe-mode選項來支援optimize功能

[[email protected] ~]# service mysql start --skip-new

OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。

對於MyISAM表,OPTIMIZE TABLE按如下方式操作:

1.     如果表已經刪除或分解了行,則修復表。

2.     如果未對索引頁進行分類,則進行分類。

3.        如果表的統計資料沒有更新(並且通過對索引進行分類不能實現修復),則進行更新。

對於BDB表,OPTIMIZE TABLE目前被對映到ANALYZE TABLE上。

對於InnoDB表,OPTIMIZE TABLE被對映到ALTER TABLE上,這會重建表。重建操作能更新索引統計資料並釋放成簇索引中的未使用的空間。


備註
1.MySQL官方建議不要經常(每小時或每天)進行碎片整理,一般根據實際情況,只需要每週或者每月整理一次即可。
2.OPTIMIZE TABLE只對MyISAM,BDB和InnoDB表起作用,尤其是MyISAM表的作用最為明顯。此外,並不是所有表都需要進行碎片整理,一般只需要對包含上述可變長度的文字資料型別的表進行整理即可。
3.在OPTIMIZE TABLE執行過程中,MySQL會鎖定表。

4.預設情況下,直接對InnoDB引擎的資料表使用OPTIMIZE TABLE,可能會顯示「 Table does not support optimize, doing recreate + analyze instead」的提示資訊。這個時候,我們可以用mysqld --skip-new或者mysqld --safe-mode命令來重啟MySQL,以便於讓其他引擎支援OPTIMIZE TABLE

相關推薦

MySQLdata_free碎片整理

在MySQL中,我們經常會使用VARCHAR、TEXT、BLOB等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——MySQL資料表碎片整理。 每當MySQL從你的列表中刪除了一行內容,該段空間就會被留空。而在一段時間內的大量刪除操

MySQL關於碎片整理OPTIMIZE TABLE操作

OPTIMIZE TABLE作用及使用MySQL關於表碎片整理OPTIMIZE TABLE操作的官方建議1.MySQL官方建議不要經常(每小時或每天)進行碎片整理,一般根據實際情況,只需要每周或者每月整理一次即可,可以寫成定時任務來做。2.OPTIMIZE TABLE只對MyISAM,BDB和InnoDB表起

MySQL 8.0.12 InnoDB碎片整理

0.準備工作: 使用sysbench建立一個表,資料行數為1000萬行。 # ls -lh /data/mysql80/sbtest/sbtest1.ibd -rw-r----- 1 mysql mysql 2.7G Sep 12 14:44 /data/mysql80/s

Mysql Innodb 碎片整理

一、為什麼會產生碎片 簡單的說,刪除資料必然會在資料檔案中造成不連續的空白空間,而當插入資料時,這些空白空間則會被利用起來.於是造成了資料的儲存位置不連續,以及物理儲存順序與理論上的排序順序不同,這種是資料碎片.實際上資料碎片分為兩種,一種是單行資料碎片,另一種是多行資料碎片.前者的意思就是一行資料,被分成

oracle索引分析索引索引碎片整理

41.oracle索引,分析索引,索引碎片整理 概述 索引分為B樹索引和點陣圖索引。我們主要研究B樹索引,B樹索引如下圖(圖片源自網路):   索引是與表相關的一個可選結構,在邏輯上和物理上都獨立於表資料,索引能優化查詢,不能優化DM

MySQL架構儲存引擎及配置

MySQL架構,儲存引擎及配置 配置檔案預設位置 Linux: /etc/my.cnf(後續都是基於linux來講解) Windows:  my.ini  在mysql安裝的home目錄 資料檔案位置 命令: show variables like '%

Navicat 連線mysql資料庫資料顯示亂碼

解決方法: 1.navicat裡右擊一個連線,選擇連線屬性,切換到高階選項卡,去掉“使用mysql字符集”前的對勾,在編碼裡選擇utf-8,這種方法對於部分問題可能適合。 2.可能是mysql的配置檔案有問題,就是在mysql 的安裝目錄下的my.ini檔案

django 遠端連線mysql資料庫變更

 連線mysql 資料庫  並生成對應的各種表: 1.  安裝 mysql, 安裝Python  mysqldb . 2.  進入django  工程文件  settings.py檔案。設定資料庫: DATABASES = { 'default': {

Mysql 資料庫欄位常用操作

一、DATABASES資料庫相關操作 -- 檢視有多少個數據庫 SHOW DATABASES; -- 刪除資料庫 DROP DATABASE 庫名; -- 建立資料庫 CREATE DATABAS

mysql 批量刪資料並且整理碎片

DROP PROCEDURE IF EXISTS prc_del_loop;CREATE PROCEDURE prc_del_loop()BEGINDECLARE v_count INT ;DECLARE v_data_free INT;my_del_loop:LOOP delete from t_data

mysql 批量刪數據並且整理碎片

delete running form finished 批量 shrink inf begin finish DROP PROCEDURE IF EXISTS prc_del_loop;CREATE PROCEDURE prc_del_loop()BEGINDECLAR

MySQL 創建設置時間字段自己主動插入當前時間

mil post div ipp strong ren current spa blog MySQL 創建表時,設置時間字段自己主動插入當前時間 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT`

基於ExtJs6前臺,SpringMVC-Spring-Mybatis,resteasy,mysql無限極設計實現樹狀展示數據(treepanel)

public clas -s 分享 rmi time pan stp listen 先從後臺講起 1.表的設計   parent_id就是另外一條記錄的id,無限極表設計可以參考 http://m.blog.csdn.net/Rookie_Or_Veteran/art

設計 MySQL 數據的時候一般都有一列為自增 ID這樣設計原因是什麽有什麽好處?

數據表 問題 innodb unique uuid 定義 記錄 原因 指向 知乎采集: MyISAM/InnoDB默認用B-Tree索引(可理解為"排好序的快速查找結構")。 InnoDB中,主索引文件上直接存放該行數據,稱為聚簇索引。次索引指向對主鍵的引用;MyISA

Mysql兩張相同ID匹配輸出到新刪除舊匹配

mysql匹配數據0x00:前言。有兩張表,一張表字段是ID-Email,另一張表字段是ID-PWD,想用SQL腳本把這兩張表合並合並,因為有相同的ID才可以匹配。0x01:示例。一個字段ID:Email另一個字段是ID:PWD想要的輸出就結果ID:Email:PWD0x02:Mysql語句。註意:因為MyS

mysql數據的基本操作:結構操作字段操作

pmp lbs 表結構 基本操作 時也 dax i2c tpc -- 本節介紹: 表結構操作 創建數據表、 查看數據表和查看字段、 修改數據表結構 刪除數據表 字段操作 新增字段、 修改字段數據類型、位置或屬性、 重命名字段 刪除字段 首發時間:

mysql 垂直分技術的實戰演練有實戰代碼。

主表 實戰 AD tab 進行 輸入 case 多個 兩張 垂直分表技術 垂直分割指的是:表的記錄並不多,但是字段卻很長,表占用空間很大,檢索表的時候需要執行大量的IO,嚴重降低了性能。這時需要把大的字段拆分到另一個表,並且該表與原表是一對一的關系。 1,垂直分表技術首先要

mysql修改編碼(數據庫字段)

char park true ID mysql nbsp pan gbk 所有 查看各個編碼 //查看字段編碼 SHOW FULL COLUMNS from park_car_user; //查看數據庫字段SHOW CREATE DATABASE db_nam

MySQL 分庫分方案總結的非常好!

導致 一個 磁盤空間 所有 bsp 功能 編程 從庫 框架 前言 公司最近在搞服務分離,數據切分方面的東西,因為單張包裹表的數據量實在是太大,並且還在以每天60W的量增長。 之前了解過數據庫的分庫分表,讀過幾篇博文,但就只知道個模糊概念, 而且現在回想起來什麽都是模模糊糊的

MySQL的入門與使用sqlyog對數據庫和數據的管理

code 輸入 app 管理表 hang value arc 默認 pan MySQL的入門    1.到mysql官網下載。    2.安裝mysql軟件(一定要放到英文路徑下)   3.使用 驗證是否成