てやんでい!職人気質 株式会社ブースターテクノロジー 2006年9月1日 土屋達哉
PHPの遷移 ☆PHP4 ~ Zend Engineと呼ばれるスクリプトエンジンを搭載。 ☆PHP5 ~ Zend Engine2.0。OOP対応。 SimpleXML、SoapClient。XML、Soapの扱いが便利に。 try-catch で例外のハンドルが可能。 かなりJavaっぽくなり、『違う言語』になってしまった感がある。 ☆2006年8月時点の最新バージョンは「4.4.4」と「5.1.5」。 4系も引き続きアップグレードされている。 ※一般的にはまだ4系が多い。
MySQLの遷移 ☆3.23.34 ~ InnoDBをサポート(トランザクション、行ロック、外部キーが可能) ☆4.0 ~ Full-text 検索 ☆4.1 ~ 副問い合わせ、UTF-8対応。 varcharがサイズ指定がバイトだったのが文字数になった。 ☆5.0 ~ ストアドプロシージャ、ビュー、トリガー、カーソル機能 ☆5.1.4 ~ パーティショニング ☆2006年8月時点の最新バージョンは「5.0.24」。5.1系はまだベータ版 ※一般的には4.0系と5.0系が使われている。
MySQLで全文検索 ☆ 4.0から加わった「FullTextインデックス」を使った検索をしたい。 → like検索より数段高速だが、日本語が扱えない → 有限会社未来検索ブラジルのSenna(組み込み型全文検索エンジン)を入れる Sennaを使うには、MySQLのリコンパイルが必要。 手順は以下の通り。 (1)Mecab(形態素解析エンジン)のインストール (2)Sennaのインストール (3)MySQLのインストール
Mecab インストール ☆ 英語の文章は単語間がスペースで区切られているが、 日本語文章だとプログラムで区切りを判別できない。 例) ■I have a dream. → スペース区切りなので区切りは明白 ■私には夢があります。 → どこが区切りかプログラムにはわからない・・ これを分割してくれるのがMecab。
Mecab デモ # mecab 私には夢があります。↓ 私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ に 助詞,格助詞,一般,*,*,*,に,ニ,ニ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 夢 名詞,一般,*,*,*,*,夢,ユメ,ユメ が 助詞,格助詞,一般,*,*,*,が,ガ,ガ あり 動詞,自立,*,*,五段・ラ行,連用形,ある,アリ,アリ ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス 。 記号,句点,*,*,*,*,。,。,。 EOS
Sennaインストール ☆ Sennaは、MySQLに組み込むことで全文検索機能を強化してくれる 全文検索エンジン。 > wget http://dev.razil.jp/archive/senna/senna-latest-svn.tar.gz > tar xvfz senna-latest-svn.tar.gz > cd senna > ./configure --prefix=/usr > make > make install
MySQLインストール ☆ MySQLのソースをダウンロード > tar zxf mysql-5.0.24.tar.gz > cd mysql-5.0.24 > patch -p1 < ../senna/bindings/mysql/mysql-5.0.24.senna.diff > patch -p1 < ../senna/bindings/mysql/mysql-5.0.24.senna.2ind.diff > autoconf > CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti -I/usr/include -L/usr/lib" ./configure --with-senna --prefix=/usr --with-charset=utf8 --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler --disable-shared --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-big-tables --without-readline > make > make install ※必ずsenna のパッチをあてる ※configure のオプションが重要
性能比較 [100万件テスト] ☆select count(*) as count from update_ping where blog_title like '%ジダン%' or entry_title like '%ジダン%' or body like '%ジダン%'; → 2.3秒 ☆SELECT count(*) FROM update_ping WHERE MATCH (blog_title, entry_title, body) AGAINST ('ジダン'); → 0.06秒!
性能比較(2) [1,000万件テスト] ☆select count(*) as count from update_ping where blog_title like '%ジダン%' or entry_title like '%ジダン%' or body like '%ジダン%'; → 43秒 ☆SELECT count(*) FROM update_ping WHERE MATCH (blog_title, entry_title, body) AGAINST ('ジダン'); → 0.6~0.7秒! テストマシン ■OS・・Fedora Core5 ■メモリ・・512MB ■CPU ・・2.53GHz/533MHz
所感 ☆ PHPは4系でいい気がする。 無理に5系にしてオブジェクト指向にする必要はないのではないか? でもtry catch は使いたい。。 ☆ MySQLは5系を使いたい。 データ件数が1000万件超で、検索機能をつけるのであれば like検索では実用に耐えない。 全文検索にすべきだが、MySQLのコンパイルが必要なので VPSや占有サーバ環境が必要。