mysql:5204
From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Tue, 26 Feb 2002 23:09:01 +0900
Subject: [mysql 05204] Re: 全件検索の時間
とみたです。 On Tue, 26 Feb 2002 22:22:11 +0900 "fuji" <fujita_n@xxxxxxxxxx> wrote: > WEBブラウザからPerlを使って検索してみたのですが、 > 9万件ぐらいで、5秒ぐらいかかります。 > 5千件ぐらいの時は一瞬でした。 > 件数が増えるとこういうものなのでしょうか? > もしくは設定が全然ダメなんでしょうか? とりあえず、Apache や Perl を介さずに、MySQL だけでも同じような結果に なるかどうか試してみてはいかがでしょうか。 > 検索は、3個のフォームに何も入力せずに検索です。 > 検索条件を入れた時はある程度早く検索します。 > 何も入力せずに、検索ボタンを押した時に早く結果を得たいと > 思ってます。 検索命令が、 > $sth = $db->prepare("SELECT * FROM test where test1 LIKE '$kw1%' and test2 > LIKE '$kw2%' and test3 LIKE '$kw3%'"); となってますが、これだとフォームに何も入力されなくても、「LIKE '%'」の 条件が指定されてしまって無駄だと思います。 「kw1 が空の場合は test1 の条件を指定しない」(kw2, kw3 も同様)という 風にプログラムを変えてみたらかなり速くなるんじゃないかと思います。 Perl は詳しくないので、具体的に書けませんが…。 # Ruby だとこんな感じ。 # # sql = 'SELECT * FROM test' # where = [] # if kw1 == '' then where << "test1 LIKE '#{kw1}%'" end # if kw2 == '' then where << "test2 LIKE '#{kw2}%'" end # if kw3 == '' then where << "test3 LIKE '#{kw3}%'" end # if where.length > 0 then # sql << ' where '+where.join(' and ') # end また、その場合は index を > index (test1,test2,test3,test4,test5) から index (test1), index(test2), index(test3) に変更した方が良いでしょう。 あと、余計なことかもしれませんが、フォームから入力された値を直接 SQL 文中に入れるのは危険です。 # Perl DBI なら、prepare でプレースホルダーを使うのが良い…のかな…? -- とみたまさひろ <tommy@xxxxxxxxxx> 日本MySQLユーザ会 http://www.mysql.gr.jp
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]