当ブログではアフィリエイト広告を利用しています

freoのデータベースをSQLite3からMySQLへ変更

ページの数が1000を超えページ一括表示プラグインを使用しているページがだいたい応答まで4秒ほどかかるようになり、さすがにおっせえなあ!と思ったので修正している最中。メモ。

xamppでMySQLで接続する際は、MySQLスタートさせてからAdminでphpmyadminを開いてデータベースを作成。
接続先:localhost
ユーザー名:root
パスワード:(なし)
で繋がった そもそもphpmyadminの設定をした記憶がないの。

引っ掛かり:元データ(SQLite)をそのままMySQLにぶっこんだ

データがバグってエラーが発生してfreoのページ自体が開かなくなった。
→データはちゃんとMySQL用に変換すること

MySQLで構築したほうで適当にページひとつふたつ登録して、それのヘッダー部分?というのか、

DROP TABLE IF EXISTS freo_entries;
CREATE TABLE `freo_entries` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

このあたりから始まるのを全部SQLiteのほうのデータの似たような部分にコピペしたほうが早い。
もしくはデータ移行ミスがあるとまずいのでSQLiteのデータの上からMySQLのデータにコピペしていく。

ページはこれで一括で流し込み終了。
ページ一括表示プラグインを入れて確認したところ、localhostでは全然差がなかったけどサーバー上でやったらSQLiteで4秒がMySQLで1秒かからなくなったのでめっちゃ早い。
→なおこの後他のデータ突っ込んでいくにしたがってどんどん遅くなっていく。

引っ掛かり:絵文字が表示されない

entryでデータをインポートすると確実に
Incorrect string value: ‘\xF0\x9F\x90\xBA<a…’ for column `(データベース名`.`freo_entries`.`text` at row 1
を吐き出す。

phpmyadminでどこまでインポートできてるか確認して問題発生の行を削除したらインポート出来たが後の行でまた引っかかった。
ひっかかる記事を確認したところ、絵文字が使われていた。
「MySQL 絵文字」で検索するとMySQLのUFT-8では絵文字が使えないと判明。なんか特殊なutf8mb4とかいうのにデータベースを変更すれば良いと判明。

ググったらphpmyadminでSQL実行して文字コードを変更する方法が出てきたのでやってみる。

確認してutf8mb4になっているのを確認。
からのインポートしたらまた同じエラー発生。
ためしにfreoの普通にエントリー登録してみたけれどもこちらも同じエラーが発生する。

confing.phpに
//文字コード(MySQL用)
define(‘FREO_DATABASE_CHARSET’, ‘utf8mb4’);
をいれたらうごいた!!

config.phpの修正

テスト用でサーバー上に置いていたconfig.phpともともとのサイトのconfig.phpを見比べていい感じに修正する。
具体的には、テスト用でサーバー上においてたものに、もともとのサイトの

//設置URL
define(‘FREO_HTTP_URL’, ‘アドレス’);
//設置URL(SSL用)
define(‘FREO_HTTPS_URL’, ‘アドレス’);

この2つをコピペする。
そしてもともとのサイトのフォルダにMySQLを見るようにされたconfig.phpを上書きすれば出来上がり。データじたいはMySQLに入ってるので面倒くさい移行作業がほぼいらない。

どのぐらい短くなったか

ページ一括表示プラグインを使用したページでの時間の差
なお計測方法はChromeのネットワークで見た。

SQLiteのデータ:4.6秒
MySQLのデータ:3.6秒

早くはなったが1秒か(それでもかなりでかいけれども)と思ってたが、後から弄ってたらこれGJ送信プラグインのデータがデカくて重いっぽい。
GJ送信プラグインのデータを全消去したところ、MySQLで1.1秒が出た。
拍手を外部のpatipatiやWeb拍手公式のCGIに変更するなりなんなりすると早くなる可能性はありそう。

しかしSQLiteからMySQLがちゃんと速度上がるとは思わなかったしデータ自体の移行もほぼコピペで可能で助かった。
ただ、これはローカルもウェブでもなんだけど、MySQLでユーザー作成がうまくいかず一度ログアウトしてからログイン出来ずに焦った。phpmyadminで確認したところfreo_usersが空っぽだったのでSQL文その場で叩いてユーザー作成した。