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]