[前][次][番号順一覧][スレッド一覧]

mysql:5208

From: "KAWAI,Takanori" <"KAWAI,Takanori" <GCD00051@xxxxxxxxxx>>
Date: Wed, 27 Feb 2002 11:51:30 +0900
Subject: [mysql 05208] Re: 全件検索の時間

川合孝典です。

----- Original Message -----
From: "fuji" <fujita_n@xxxxxxxxxx>
To: <ml@xxxxxxxxxx>
Sent: Wednesday, February 27, 2002 10:29 AM
Subject: [mysql 05207] Re: 全件検索の時間


> ふじです。
> お世話になってます。
> いろいろな意見をありがとうございます。
>
> 確かに、 LIKE は全件検索では必要ないです。
> ありがとうございます。
> しかしテストで Where 以下を除いてみたのですが、
> やはり5秒ほどかかります。??
>
> >それに配列にデータを突っ込んでいるみたいですし。
> 配列に入れるのを外しても変わりませんでした。
> やはり単純に件数が多いからでしょうか。
単純にいうとその通りでしょう。
さらにいえば、それだけループの回数が掛かること、
さらに出力する文字列(printで出力されるデータの全体)が
大きくなることが大きいでしょう。
SELECTで結果セットを作成することもありますから、それも
影響あるはずですが、それ以上にこっちのほうが大きいんじゃないか
と思います。
どのあたりで時間が掛かっているのか気になるのであれば、
開始時刻や中間の時刻を取得して計測してみるのが一番でしょう。

(1)printを抑止してみる(データの出力だけ)
(2)ループを途中で抜けてみる
とかしてみれば、違いが明確になるでしょう。
#90,000件表示でも5秒しか掛からないというのは、それはそれで
#すごいんだと思うんですけどねぇ。

インデックスに関しては複数フィールドにまたがるインデックスか、
個別にインデックスを作成するかっていうことです。

[サンプル]
#プレースホルダを使っています。
#それにしてもなんでfetchrow_arrayを使うソースが多いのはなぜ?
use strict;
use DBI;
my $db = DBI->connect('DBI:mysql:test:localhost','','',
                {AutoCommit=>0, RaiseError=>1, PrintError=>0});
my $tSt = localtime;
$db->commit;
if(lc($ARGV[0]) eq 'new') {
  $db->do('DELETE FROM test');
  my $shI = $db->prepare('INSERT INTO test values(?, ?, ?, ?, ?)');
  for(my $i=0; $i<90000; $i++){
        $shI->execute(sprintf('%06d', $i), 'AA', 'B', 'C', 'DDDDDDDD');
  }
  $db->commit;
}
my @aWhere=();
my @aPlsH=();
my ($kw1, $kw2, $kw3) = ('', '', '');
if($kw1) {
        push @aWhere, 'test1';
        push @aPlsH,  "$kw1%";
}
if($kw2) {
        push @aWhere, 'test2';
        push @aPlsH,  "$kw2%";
}
if($kw3) {
        push @aWhere, 'test3';
        push @aPlsH,  "$kw3%";
}
my $sWhere='';
if(@aWhere) {
        $sWhere = ' where ' . join(' and ', map { "$_ LIKE ?"} @aWhere);
}
print $sWhere;
my $tMid = localtime;
my $sth = $db->prepare('SELECT * FROM test' . $sWhere);
$sth->execute(@aPlsH);
my $iHit=0;
my $iSrch=0;
my $raD;
my($sInsD, $sPreD);
my $sData ='';
$sPreD = '';
my $tLoop = localtime;
while($raD = $sth->fetchrow_arrayref()) {
        ++$iSrch;
        $sInsD = join(',', @$raD[0..2]);
        #last;
        if($sPreD ne $sInsD) {
                ++$iHit;
        }
        $sData .= join(',', @$raD). "<br>\n";
}
$sth->finish();
$db->disconnect;
my $tEnd = localtime;

print<<EOH;
Content-type: text/html

<HTML><BODY>
$iHit 件 ($iSrch)見つかりました<BR>
$sData
$iHit 件 ($iSrch)見つかりました<BR>
START: $tSt <BR>
MID  : $tMid <BR>
LOOP : $tLoop <BR>
END  : $tEnd <BR>
</BODY></HTML>
EOH
===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr@xxxxxxxxxx GCD00051@xxxxxxxxxx
   http://member.nifty.ne.jp/hippo2000
   http://www.hippo2000.net/
「Perlを256倍使うための本 DBI編」 3/14発売予定(^^)
===================================================


[前][次][番号順一覧][スレッド一覧]

      5201 2002-02-26 22:22 ["fuji" <fujita_n@xxx] 全件検索の時間                          
      5202 2002-02-26 23:01 ┣[tateyan <tateyan@xxx]                                       
      5203 2002-02-26 23:09 ┣["KAWAI,Takanori" <GC]                                       
      5204 2002-02-26 23:09 ┗[とみたまさひろ <tomm]                                       
      5205 2002-02-27 00:11  ┗[tateyan <tateyan@xxx]                                     
      5206 2002-02-27 03:34   ┗["Takuji Hidaka" <tak]                                   
      5207 2002-02-27 10:29    ┗["fuji" <fujita_n@xxx]                                 
->    5208 2002-02-27 11:51     ┗["KAWAI,Takanori" <GC]