Sinatraで作ったアプリのデータがぼちぼち増えてきたので整理しますか

増えてきたと言うても、ディスク容量は余裕。では何故にぼちぼち整理が必要かというと、理由はレスポンスがモッサリ〜ニな事が原因です。SlowQueryを見ているとサーバー側の負荷なんてのは全くないですし、モッサリ〜ニなのは完全にブラウザ側の負担なのでした。
Jqueryでちょこっと機能を負荷しているだけで、なんの工夫もしてないからね。当然といえば当然なのです。

整理をしますか!というと、Sinatraで作ったアプリが〜とか言っていますし、流れ的にもプログラムでやるのがセオリーと言うか、最近はプログラム勉強日記みたいだし、そうじゃないの?と思うことでしょう。自分もそう思います。
違います。
サーバーでやります。

決して、プログラムを書くのがめんどくさいからではない!!
こっちの方法が楽だからだ!!

アルゴリズム的なことを考えますか。過去の勉強会のデータは要らないので。

・古い日付のデータを削除する。

以上だ。
1行でまとまってしまったぞ。

では行動に移すぞっと。

数ヶ月間放置しているので、ちょっとワクワクで容量はどのくらいかなと調べると

[takeken@vincentina]# sudo du -h --max-depth=1 /var/lib/mysql
1.3M    /var/lib/mysql/zabbixman
992K    /var/lib/mysql/mysqlum
692K    /var/lib/mysql/sinatra_projects_bytakeken
1.0M    /var/lib/mysql/wpdata_hogepy
2.6G    /var/lib/mysql 

すくねー。ぜんぜん増えてないし!!テキストデータだしね。やっぱりプログラム側でブラウザに表示される項目を制限した方が効果は高いんだろうなぁ。後でやりますか。

せっかくサーバーにログインしたので、データベースのデータも整理してしまいましょう。

テーブルはこんな感じです。

mysql> desc topics;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| event_id   | int(11)       | NO   | PRI | NULL    |       |
| event_url  | varchar(1024) | NO   |     | NULL    |       |
| title      | varchar(1024) | YES  |     | NULL    |       |
| address    | varchar(2048) | YES  |     | NULL    |       |
| theme      | varchar(4096) | YES  |     | NULL    |       |
| place      | varchar(2048) | YES  |     | NULL    |       |
| started_at | date          | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+ 

Started_atから過去のデータを削除するのが楽やろうね。
ブラウザからだとモッサリしますが、まだまだこんなもんです。

mysql> select count(*) from topics where started_at;
+----------+
| count(*) |
+----------+
|     2194 |
+----------+ 

今年の3月より過去のものは削除しましょうか。

mysql> select count(*) from topics where started_at <  '2015-03-01 00:00:00';
+----------+
| count(*) |
+----------+
|     1657 |
+----------+
1 row in set (0.00 sec)
mysql> delete from topics where started_at <  '2015-03-01 00:00:00';
Query OK, 1657 rows affected (0.02 sec)
mysql> select count(*) from topics where started_at <  '2015-03-01 00:00:00';
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec) 

 

終わりました!

でもこれだとプログラムはそのままなので根本的な問題が解決できていないんだよね。いや、DB側で対処したので根本的な問題を解決したのか。うーん。これはトゲゾーのジレンマだな。

まぁどちらにしろ問題は解決して、アクセスしてみると随分軽くなりました。
削除の作業なんでわずか数秒の出来事です。プロのプログラマーなら数秒でコードが書けるかもしれませんが、わたしはアマのプログラマー、アマグラマーなのです。
ええ、アマグラマーって使ってみたかっただけです。はい。

ではCronにでも入れておきますか。まずはCronで回すスクリプトを作成しましょう。

10日前の日付ゲット。

[takeken@vincentina]# date +"%Y-%m-%d" -d '10 days ago'
2015-02-21 

出来上がったのがこんな感じ。

#!/bin/bash

MAIL_TO="メールアドレス"
LOG_FILE="フルパス"
dayoflimit=`date +"%Y-%m-%d" -d '10 days ago'`

mysql -uDBユーザ名 -pDBパスワード -D DB名 \
-e "delete from topics where started_at < '$dayoflimit';" | \
tee -a $LOG_FILE | mail -s "Delete old data  "$HOST_NAME $MAIL_TO

sudo mv $LOG_FILE $LOG_FILE.`date +%Y%m%d` 

これでだいじょうぶなはず。毎日回して10日以前のデータは蓄積しない状態になりました。あとはプログラムを書き換えてブラウザに表示される項目を減らせば完了ですね〜。
RAILSにリメイクしようと思っていましたが、それもまた今度ですね。
今回は終了です。
次回はいったいいつになるのやら。

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です