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