Tuesday, August 9, 2011

Оптимізація mysql

Для оптимізація mysql бази даних є кілька важливих моментів

  1.  потрібно визначити загальний обєм всіх індексів у всіх базах даних, це можна зробити за допомогою команди


  2. 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)  не розрізняється.. виправити не проблема..  )


  3.  Для швидкої оптимізації 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 таблиць

  4. 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






  5.  Замітка по оптимізації за допомогою optimize: Якщо по таблиці є кілька індексів (крім primary) - при великій твблиці цей процес може розтягрутись на години(!). В такому випадку в рази швидше буде якщо  дропати індекси, виконувати optimize і тоді перестворювати індекси.

No comments: