前言

在小鸡上跑了个数据库,表里数据快过百万了,每次跑定时任务都要半分钟以上,任务每分钟跑一次,所以小鸡鸡CPU长时间处于满载状态,有必要对数据库进行优化减负。

现象

最简单的方法便是使用PHP-myadmin这种工具了,直接在后台勾选要优化的表,然后对选中表进行分析优化即可。在优化过程中,有可能出现如下提示:

1
Table does not support optimize, doing recreate + analyze instead

这是因为该MySQL表使用的是 innodb 引擎,此时你需要通过其他方式进行优化。

一键shell

在删除完垃圾数据后,对表进行优化可减小表的体积,同时优化索引加快表查询速度,整理了如下命令,保存为 .sh 使用即可。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
echo -n "MySQL username: " ; read username
echo -n "MySQL password: " ; stty -echo ; read password ; stty echo ; echo

mysql -u $username -p"$password" -NBe "SHOW DATABASES;" | grep -v 'lost+found' | while read database ; do
mysql -u $username -p"$password" -NBe "SHOW TABLE STATUS;" $database | while read name engine version rowformat rows avgrowlength datalength maxdatalength indexlength datafree autoincrement createtime updatetime checktime collation checksum createoptions comment ; do
if [ "$datafree" -gt 0 ] ; then
fragmentation=$(($datafree * 100 / $datalength))
echo "$database.$name is $fragmentation% fragmented."
mysql -u "$username" -p"$password" -NBe "OPTIMIZE TABLE $name;" "$database"
fi
done