1. 程式人生 > >MYSQL:空間碎片的清理方案(該方案基於獨立表空間)

MYSQL:空間碎片的清理方案(該方案基於獨立表空間)

清除表碎片 (1)MyISAM表 mysql> optimize table 表名 (2)InnoDB表 mysql> alter table 表名 engine=InnoDB Engine不同,OPTIMIZE 的操作也不一樣的,MyISAM 因為索引和資料是分開的,所以 OPTIMIZE 可以整理資料檔案,並重排索引. OPTIMIZE 操作會暫時鎖住表,而且資料量越大,耗費的時間也越長,它畢竟不是簡單查詢操作.所以把 Optimize 命令放在程式中是不妥當的,不管設定的命中率多低,當訪問量增大的時候,整體命中率也會上升,這樣肯定會對程式的執行效率造成很大影響.比較好的方式就是做個shell,定期檢查mysql中 information_schema.TABLES欄位,檢視 DATA_FREE 欄位,大於0話,就表示有碎片 建議:清除碎片操作會暫時鎖表,資料量越大,耗費的時間越長,可以做個指令碼,定期在訪問低谷時間執行,例如每週三凌晨,檢查DATA_FREE欄位,大於自己認為的警戒值的話,就清理一次。
轉載:
http://blog.csdn.net/eagle89/article/details/78017505
//shell指令碼如下: mysql_user=root
mysql_pass=xxxx
time_log=/opt/database/time
databases=/opt/database/databases
mysql -u$mysql_user -p$mysql_pass -e "show databases" | grep -v "Database" > $databases
sed -i "s/information_schema//" $databases
sed -i "s/mysql//" $databases
sed -i "s/test//" $databases
sed -i "s/performance_schema//" $databases
databases1=$(cat /opt/database/databases)
for i in $databases1
do
echo "database $i staring"
tables=$(mysql $i -u$mysql_user -p$mysql_pass -e "show tables" | grep -v "Tables" > /opt/database/$i)
tablelist=$(cat /opt/database/$i)
echo "optimize database $i starting" >> $time_log
echo "$i start at $(date +[%Y/%m/%d/%H/%M/%S])" >> $time_log
for list in $tablelist
do
echo $list
mysql $i -u$mysql_user -p$mysql_pass -e "alter table $list engine=InnoDB"
done
echo "$i end as $(date +[%Y/%m/%d/%H/%M/%S])" >> $time_log
echo >> $time_log
done