MySQL特集その3 全文検索測定 [2006/08/28]

mecab,sennaとインストールが済んだので今度は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 のオプションが重要

> ./scripts/mysql_install_db --user=mysql
> chown -R mysql.mysql /usr/var
> chmod 755 /usr/var
> cp support-files/my-medium.cnf /etc/my.cnf
> /usr/bin/mysqld_safe --user=mysql &

さぁ、いよいよテストデータを入れて違いを見てみましょう。
以下簡単なテスト結果を記載します。ご参考までに。

[100万件の場合]
☆select 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秒!

[1000万件の場合]
☆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秒!

恐るべし全文検索の威力。。
1000万件クラスのデータで、検索機能をつけるのならlike検索では実用に耐えないので全文検索がオススメです。

ちなみにマシンはウチのテスト用PCです。
■OS・・Fedora Core5
■メモリ・・512MB
■CPU ・・インテル Celeron Dプロセッサ 326(256KB L2キャッシュ/2.53GHz/533MHz FSB)