[Senna-dev 100] Re: MySQLバインディングで大量のレコードがヒットするとき

Back to archive index

Kazuhiro Osawa ko****@yappo*****
2005年 7月 1日 (金) 05:23:39 JST


大沢です。


> > SQL_CALC_FOUND_ROWS使っているから大丈夫だろうと思っていたのですが
> > よく考えれば全件MYDを読んじゃう処理になるのですね。。。
> 
> そうなんですよー。

他にも limit 10000,100とかやると10100行の読み込みが発生するようですね。
基本的に
select title, comment from sites where match(keywords) against('+key +key2' in boolean mode) limit 100, 10;
というようなクエリしか使っていないので、途中の行を読み込むのが無駄だったので
無駄な行の読み込みをスキップするパッチを作ってみました。
結果的にSQL_CALC_FOUND_ROWSも速くなりました。

http://tech.yappo.jp/download/senna/mysql-4.0.24.senna.sen_skipmode_set.diff

in boolean modeのみに対応しています。
linux&mysql 4.0.24&senna rev21 での動作は確認できてます。

sen_skipmode_setというMySQLネイティブな関数を追加しており
select sen_skipmode_set(1)でスキップモードon
select sen_skipmode_set(0)でスキップモードoff
となります。

使い方としては
select sen_skipmode_set(1);
select sql_calc_found_rows title, comment from sites
 where match(keywords) against('+key +key2' in boolean mode) limit 10000, 100;
select sen_skipmode_set(0);
select found_rows();
こんな感じです。

where句に他の条件式をつけたり、order by/group by/having等と
一緒に使うとおかしな事になると思います。


> udfにrowidを渡す手があるなら望みがありそうな気がします。

./myisam/と./sql/の各ソース間でのデータ受け渡し方法を考えていたのですが
pthread_key_*を使うのが手っ取り早そうでした。
今回のパッチでも使いました。

---
osawa



Senna-dev メーリングリストの案内
Back to archive index