程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 對mysql表進行優化、分析、檢查和修復的說明

對mysql表進行優化、分析、檢查和修復的說明

編輯:關於MYSQL數據庫

對數據庫的管理常規就是進行預防性的維護,以及修復那些出現問題的內容。

進行檢查和修復通常具有四個主要的任務:

1. 對表進行優化

2. 對表進行分析(分析並存儲MyISAM和BDB表中鍵的分布)

3. 對表進行檢查(檢查表的錯誤,並且為MyISAM更新鍵的統計內容)

4. 對表進行修復(修復被破壞的MyISAM表)

一、對表進行優化

優化表有很多方式實現: OPTIMIZE TABLE語句、MySQLcheck工具(服務器要運行)或myisamchk(服務器沒有運行或表中沒有交互)

為什麼優化?隨著MySQL的使用,包括BLOB和VARCHAR字節的表將變得比較繁冗,因為這些字段長度不同,對記錄進行插入、更新或刪除時,會占有不同大小的空間,記錄就會變成碎片,且留下空閒的空間。像具有碎片的磁盤,會降低性能,需要整理,因此要優化。

1. 利用OPTIMIZE語句對表進行優化

# MySQL>OPTIMIZE TABLE 表名

這樣就對表名進行了優化。

2. 利用MySQLcheck對表進行優化

MySQLcheck可進行優化外,還可執行大量的檢查和修復任務。

# MySQLcheck -o 數據庫名 表名 -uroot -p111111 (一張表)

# MySQLcheck -o 數據庫名 表名1 表名2 -uroot -p111111 (多張表)

# MySQLcheck -o 數據庫名 -uroot -p111111 (對整個數據庫)

3. 利用myisamchk對表進行優化

# myisamchk --quick --check-only-changed --sort-index --analyze 表名

# myisamchk -r 表名 (參數-r表示對表進行修復,同時也刪去了浪費的空間)

# myisamchk -r /usr/local/MySQL/data/testblog/article (指定表所在的路徑)

以上操作需在服務器關閉或沒有與服務器互操作的時候,可以使用myisamchk命令行工具(如果服務器正在運行,那麼在運行這條語句之前利用MySQLadmin flush-tables對表進行刷新。需確保服務器沒有與表進行互操作,否則會出現故障)。myisamchk是最老的方法。必須在正確位置上運行myisamchk,或者指定表所在的路徑。

注意:在優化過程中,表會被鎖住,因此不要在忙時進行優化操作。同樣,需要有足夠的空間才能進行OPTIMIZE TABLE。如果沒有磁盤空間,MySQL將不能進行優化,表也無法使用。

優化是對包含MyISAM表的數據庫的常規管理事務中一個重要環節,應該定期進行。

二、對表進行分析

對表的定期分析可以改善性能,且應該成為常規維護工作的一部分。因為通過更新表的索引信息對表進行分析,可改善數據庫性能。

有三種方法可以對表進行分析:

1. 連接到MySQL時,使用ANALYZE TABLE語句

2. 利用MySQLcheck命令行工具(服務器需要運行,並且只對MyISAM表起作用)

3. 利用myisamchk命令行工具(服務器不應該運行,或無對所操作的表發生互操作)

# ANALYZE TABLE 表名;

# MySQLcheck -a 數據庫名 表名 -uroot -p111111

# MySQLcheck -a 數據庫名 表名1 表名2 -uroot -p111111

如果試圖對不支持分析操作的表進行分析(如InnoDB),那操作將無法進行

# myisamchk -a /usr/local/MySQL/data/數據庫/表名

MySQL 在\行一段rg後,速度慢,其中一原因是一段rg後,S著碇熱莸母淖,表的素引的ystatistics)^期,使得化器 (Optimizer)在絛脅樵(query)操作r不能提供最查策略。榇誦枰ㄆ恚繞涫牆常絛insert,update, delete等倏vZ句的硪ㄆ谶\行"ANALYZE TABLE"命令更新表的y信息(statistics)。了一小的bash script,放在Linux的crontab中定期絛小下面是bash script 和sql analyze table 的script.
------------------analyze_table.sh---------------------------
#!/bin/bash
MYSQL_DIR=/usr/local/MySQL
USERNAME=root
PASSWord=root
SOCKET="/tmp/MySQL.sock"
DBNAMES="`$MYSQL_DIR/bin/MySQL --user=$USERNAME --password=$PASSWord --socket=$SOCKET --batch --skip-column-names -e "show databases"| sed 's/ /%/g'`"
for DB in $DBNAMES;do
echo "start analyze database:"$DB"......"
TABLENAMES="`$MYSQL_DIR/bin/MySQL --user=$USERNAME --password=$PASSWord --socket=$SOCKET --batch --skip-column-names --database=$DB -e "show tables"| sed 's/ /%/g'`"
for TABLE in $TABLENAMES; do
$MYSQL_DIR/bin/MySQL --user=$USERNAME --password=$PASSWord --socket=$SOCKET --batch --skip-column-names --database=$DB -e "analyze table $TABLE"
done
done
exit 0

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved