mysql表碎片的查詢自己回收
在MySQL中,我們經常會使用VARCHAR、TEXT、BLOB等可變長度的文字資料型別。不過,當我們使用這些資料型別之後,我們就不得不做一些額外的工作——MySQL資料表碎片整理。
每當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='test';
或者
select table_name,engine,table_rows,data_length+index_length length,DATA_FREE from information_schema.tables where data_free !=0;
+------------+--------+------------+--------+-----------+
| table_name | engine | table_rows | length | DATA_FREE |
+------------+--------+------------+--------+-----------+
| curs | InnoDB | 0 | 16384 | 0 |
| t | InnoDB | 10 | 32768 | 0 |
| t1 | InnoDB | 9 | 32768 | 0 |
| tn | InnoDB | 7 | 16384 | 0 |
+------------+--------+------------+--------+-----------+
table_name 表的名稱
engine :表的儲存引擎
table_rows 表裡存在的行數
data_length 表的大小(表資料+索引大小)
DATA_FREE :表碎片的大小
以上單位都是byte位元組
整理碎片:
整理碎片過程會鎖邊,儘量放在業務低峰期做操作
1、myisam儲存引擎回收碎片
optimize table aaa_safe,aaa_user,t_platform_user,t_user;
2、innodb儲存引擎回收碎片
alter table t engine=innodb;
備註:
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或
指令碼回收innodb表碎片
#!/bin/bash
DB=test
USER=root
PASSWD=root123
HOST=192.168.2.202
MYSQL_BIN=/usr/local/mysql/bin
D_ENGINE=InnoDB
$MYSQL_BIN/mysql -h$HOST -u$USER -p$PASSWD $DB -e "select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='"$DB"' "';" | grep -v "TABLE_NAME" >tables.txt
for t_name in `cat tables.txt`
do
echo "Starting table $t_name......"
sleep 1
$MYSQL_BIN/mysql -h$HOST -u$USER -p$PASSWD $DB -e "alter table $t_name engine='"$D_ENGINE"'"
if [ $? -eq 0 ]
then
echo "shrink table $t_name ended." >>con_table.log
sleep 1
else
echo "shrink failed!" >> con_table.log
fi
done
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2135576/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 回收mysql表的碎片MySql
- 表中出現碎片,造成查詢、DML操作變慢
- MySQL表碎片整理MySql
- MySQL單表查詢MySql
- mysql鎖表查詢MySql
- MySQL 單表查詢MySql
- MySQL的表碎片處理MySql
- SQL server資料庫表碎片比例查詢語句SQLServer資料庫
- MySql 鎖表 查詢 命令MySql
- 查詢MySQL資料庫,MySQL表的大小MySql資料庫
- [MySQL] - 聯表查詢,查詢一個不在另一個表的記錄MySql
- mysql 三表關聯查詢MySql
- mysql三表關聯查詢MySql
- MySQL join連表查詢示例MySql
- MySQL 5.7 查詢InnoDB鎖表MySql
- mysql查詢表基礎資訊MySql
- mysql查詢表的資料體積MySql
- MySQL的 data_free,表碎片整理MySql
- MySQL 查詢所有表中的記錄數MySql
- MYSQL INNODB中hash查詢表的實現MySql
- mysql三張表關聯查詢MySql
- MySQL 查詢大表注意事項MySql
- Mysql大表查詢注意事項MySql
- mysql 查詢建表語句sqlMySql
- MySQL 覆蓋索引、回表查詢MySql索引
- MySQL(三) 資料庫表的查詢操作【重要】MySql資料庫
- mysql 查詢記錄數大於一千萬的表MySql
- MYSQL A、B表陣列關聯查詢MySql陣列
- mysql三表關聯查詢練習MySql
- mysql 跨表查詢、更新、刪除示例MySql
- 優化mysql資料字典表查詢優化MySql
- MySQL 合併查詢union 查詢出的行合併到一個表中MySql
- 子查詢-表子查詢
- 查詢表的大小
- Access查詢實現Mysql的 limit 查詢MySqlMIT
- mysql的子查詢MySql
- mysql資料庫連表查詢的幾種方法MySql資料庫
- mysql查詢表中日期最大的那條資料MySql