[Senna-dev 526] MySQL5.0でのパフォーマンス悪化 及び 2indパッチの不具合の件

Back to archive index

坂根 有 sakan****@skygr*****
2007年 3月 28日 (水) 15:01:35 JST


お世話になります。坂根と申します。

先日、末長様へ個人的にメールさせて頂きましたが
MLのほうで報告をすればサポートできるかもというこでしたので
期待を込めてメールさせていただきます。

何点か不具合と思われる現象がありました。

動作確認環境は以下の通りです。

環境1
mysql-5.0.37 +  tritonn-1.0.0.mysql-5.0.37.senna-1.0.2
Senna 1.02
MeCab

環境2
mysql-4.1.22 + 4.122用MySQLバインディングパッチ(末長様に頂きました)
Senna 1.03
MeCab

使用テーブル

CREATE TABLE `blog_items` (
  `blogid` int(11) NOT NULL default '0',
  `itemid` int(11) NOT NULL default '0',
  `commentid` int(11) NOT NULL default '0',
  `title` varchar(160) NOT NULL default '',
  `body` text NOT NULL,
  `more` text NOT NULL,
  `blog` int(11) NOT NULL default '0',
  `author` varchar(60) NOT NULL default '',
  `wdate` date NOT NULL default '0000-00-00',
  `wtime` datetime NOT NULL default '0000-00-00 00:00:00',
  `closed` tinyint(2) NOT NULL default '0',
  `draft` tinyint(2) NOT NULL default '0',
  `catid` int(11) NOT NULL default '0',
  `search` text NOT NULL,
  PRIMARY KEY  (`blogid`,`itemid`,`commentid`),
  KEY `date_idx` (`wdate`),
  KEY `wtime_idx` (`wtime`),
  FULLTEXT KEY `author_full_idx` (`author`),
  FULLTEXT KEY `search_full_idx` (`search`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis;

一回FULLTEXT INDEXは消して
ALTER TABLE blog_items ADD FULLTEXT author_full_idx USING NGRAM (author), ADD FULLTEXT search_full_idx (search);
で作り直しました。

  CREATE TABLE `master_blog` (
    `blog_id` int(11) NOT NULL auto_increment,
    `blog_name` varchar(100) NOT NULL default '',
    `blog_dir` varchar(20) NOT NULL default '',
    `blog_dbname` varchar(20) NOT NULL default '',
    `blog_url` varchar(100) NOT NULL default '',
    `search_flag` tinyint(4) NOT NULL default '0',
    `sum_flag` int(11) NOT NULL default '1',
    `access_group` text NOT NULL,
    `partner_flg` tinyint(4) NOT NULL default '0',
    `daredemo_flg` tinyint(4) NOT NULL default '0',
    `status` varchar(20) NOT NULL default '',
    PRIMARY KEY  (`blog_id`)
  ) ENGINE=MyISAM  DEFAULT CHARSET=ujis PACK_KEYS=0 AUTO_INCREMENT=231 
  ;

データはblog_itemsには35万レコード,master_blogには231レコードは行っております。

まず以下の比較的簡単なクエリで4.1環境では0.2秒で終わるクエリが
5.0環境では20秒近くかかり極端にパフォーマンスが落ちました。

実行した SQL:
SELECT SQL_CALC_FOUND_ROWS *
FROM blog_items
LEFT JOIN master_blog ON blog_items.blogid = master_blog.blog_id 
WHERE blog_items.blogid = 5 LIMIT 0 , 100

4.1環境でのEXPLAIN結果
id  select_type  table  type  possible_keys  key  key_len  ref  rows 
Extra
1 SIMPLE blog_items ref PRIMARY PRIMARY 4 const 28378 Using where 
1 SIMPLE master_blog eq_ref PRIMARY PRIMARY 4 bcounter.blog_items.blogid 1   

5.0環境でのEXPLAIN結果
id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
1 SIMPLE blog_items ref PRIMARY PRIMARY 4 const 36801   
1 SIMPLE master_blog const PRIMARY PRIMARY 4 const 1   

パッチを当てていないMYSQL5.0でも検証しても
起こるためMYSQL5.0の問題と思っております。

そこで5.0ではパフォーマンスがでないため
末長様にMYSQL4.1.22用のパッチを頂きました。

MYSQL4.1では全体的にパフォーマンスもよく検索できておりましたが
バグと思われる挙動があり困っております。(MYSQL5.0+Tritonn環境でも発生します)

------------------------------------------------------------------------------------------
1点目 0件目からのLimitでない場合結果が取得できない。
------------------------------------------------------------------------------------------
以下のクエリは正常に結果が取得できます。
SELECT * FROM blog_items
LEFT JOIN master_blog ON blog_items.blogid = master_blog.blog_id 
WHERE MATCH (search) AGAINST ('test') AND master_blog.search_flag =1 
LIMIT 0,10

ところが以下のようにLIMITで0件目からの取得でない場合結果が空になります。(カウントでは200件あります)
SELECT * FROM blog_items
LEFT JOIN master_blog ON blog_items.blogid = master_blog.blog_id 
WHERE MATCH (search) AGAINST ('test') AND master_blog.search_flag =1 
LIMIT 10,10
------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------
2点目 SQL_CALC_FOUND_ROWSで総件数を取得する場合limitの値で総件数が変動します。
------------------------------------------------------------------------------------------
SELECT SQL_CALC_FOUND_ROWS * FROM blog_items WHERE MATCH (search) 
AGAINST ('test') AND (master_blog.search_flag = 1) limit 120,10

と

SELECT SQL_CALC_FOUND_ROWS * FROM blog_items WHERE MATCH (search) 
AGAINST ('test') AND (master_blog.search_flag = 1) limit 10,10

では違う件数になってしまいます。
------------------------------------------------------------------------------------------

2indパッチを当てずに検証しましたところ発生いたしませんでした。

現状2indパッチを使用しない形で実運用に組み込もうと考えておりますが
今後のことが少々不安ですのでTritonnプロジェクトでの
4.1系の開発を要望としてあげさせていただきます。

以上よろしくお願いいたします。




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