BB-WAVE.com『仕事に使えるARCHIVES』 PowerPoint 用テンプレート

てやんでい!職人気質
株式会社ブースターテクノロジー
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系が多い。
2
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系が使われている。
3
MySQLで全文検索
☆ 4.0から加わった「FullTextインデックス」を使った検索をしたい。
→ like検索より数段高速だが、日本語が扱えない
→ 有限会社未来検索ブラジルのSenna(組み込み型全文検索エンジン)を
入れる
Sennaを使うには、MySQLのリコンパイルが必要。
手順は以下の通り。
(1)Mecab(形態素解析エンジン)のインストール
(2)Sennaのインストール
(3)MySQLのインストール
4
Mecab インストール
☆ 英語の文章は単語間がスペースで区切られているが、
日本語文章だとプログラムで区切りを判別できない。
例)
■I have a dream.
→ スペース区切りなので区切りは明白
■私には夢があります。
→ どこが区切りかプログラムにはわからない・・
これを分割してくれるのがMecab。
5
Mecab デモ
# mecab
私には夢があります。↓
私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
夢 名詞,一般,*,*,*,*,夢,ユメ,ユメ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
あり 動詞,自立,*,*,五段・ラ行,連用形,ある,アリ,アリ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
6
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
7
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 -felideconstructors -fno-exceptions -fno-rtti -I/usr/include -L/usr/lib" ./configure --with-senna
--prefix=/usr --with-charset=utf8 --with-extra-charsets=complex --enable-thread-safeclient --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 のオプションが重要
8
性能比較
[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秒!
9
性能比較(2)
[1,000万件テスト]
☆select count(*) as count from update_ping
where blog_title like '%ジダン%'
テストマシン
■OS・・Fedora Core5
■メモリ・・512MB
■CPU ・・2.53GHz/533MHz
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秒!
10
所感
☆ PHPは4系でいい気がする。
無理に5系にしてオブジェクト指向にする必要はないのではないか?
でもtry catch は使いたい。。
☆ MySQLは5系を使いたい。
データ件数が1000万件超で、検索機能をつけるのであれば
like検索では実用に耐えない。
全文検索にすべきだが、MySQLのコンパイルが必要なので
VPSや占有サーバ環境が必要。
11