- потрібно визначити загальний обєм всіх індексів у всіх базах даних, це можна зробити за допомогою команди
- Для швидкої оптимізації myisam mysql таблиць можна скоритатися такою командою:
for d in `mysql -e "show databases"|g -v Database|g -v information_schema` ; do echo " -------- $d ----------" && for t in `mysql -D $d -e "SHOW TABLE STATUS WHERE Data_free > 0 " | awk '{ if ($2 == "MyISAM") printf $1 "\n"}'`; do echo $t && mysql -D $d -e "optimize table $t" ; done ; done
Для optimize конкретної бази:for t in `mysql -D dbname -e "show tables" |grep -v Tables` ; do echo $t ; mysql -D dbname -e " optimize table $t" ; done
Для innodb таблиць: - Замітка по оптимізації за допомогою optimize: Якщо по таблиці є кілька індексів (крім primary) - при великій твблиці цей процес може розтягрутись на години(!). В такому випадку в рази швидше буде якщо дропати індекси, виконувати optimize і тоді перестворювати індекси.
s=0; i=0; for d in `mysql -e "show databases" |grep -v Database ` ; do i=`mysql -D $d -e "show table status" | awk '{sum= sum+$9;} END {print sum}'` ; echo $i |grep . > /dev/null || i=0; echo "$d ---> $i" ; s=`echo $s+$i|bc` ; done ; echo "index size: $s bytes"
виводить список баз даних і відповідно розмір індексів в ній, а в кінці загалний розмір індексу
(правда тут тип (myisam, innodb) не розрізняється.. виправити не проблема.. )
for d in `mysql -e "show databases"|g -v Database|g -v information_schema` ; do echo " -------- $d ----------" && for t in `mysql -D $d -e "SHOW TABLE STATUS WHERE Data_free > 0 " | awk '{ if ($2 == "InnoDB") printf $1 "\n"}'`; do echo $t && mysql -D $d -e "optimize table $t" ; done ; done
No comments:
Post a Comment