###データーベースの検索表示の速度を速くするには?
下記のようにMySQLで作成したデーターベースから、HTMLフォームに製品名を入力、
プルダウンメニューで期間を選択してデータ検索するプログラムを作成しています。
テーブル名:product
フィールド①:id id番号 int (主キー)
フィールド②:name 製品名 varchar (インデックス)
フィールド③:year 製造年月 int
フィールド④:serial シリアル varchar
フィールド⑤:area 地域 varchar
フィールド⑥:price 価格 int
フィールド⑦:note 特記 varchar
全データー数(①のid)は約250.000
製品名数(②のname) は約 50.000
ディスク使用量合計 37,968 KiB
下記のように2段階で検索表示させています。
- 期間を選択し、検索(あいまい検索)で一致した製品名リストを表で表示させる。
製品名A 「詳細」ボタン
製品名B 「詳細」ボタン
製品名C 「詳細」ボタン
・
・
・
2) 各製品名リスト毎にに設置した「詳細」ボタンをクリックし各製品の詳細情報を表示させる。同名の製品名の詳細が複数表示されます。
製品名A 製造年月 シリアル 地域 価格 特記
製品名A 製造年月 シリアル 地域 価格 特記
・
・
・
問題は、1)の検索結果数が多いと、2)の検索結果表示が遅くなります。
1)の検索結果数が500くらいだと、2)の検索結果も比較的スムーズに表示されますが、
1)の検索結果数が3000以上になると、2)の検索結果表示は30秒ほどもかかります。
1)の検索を、前方一致や後方一致で絞込んでを数を減らすとスムーズに表示されます。
検索の対象となるフィールドが増えると遅くなるのでしょうか?
どこが問題なのか分からず質問させていただきました。
ご指導のほどよろしくお願いいたします。
プログラムは下記の通りです。
index.php
list.php
detail.php
###index.php
<BODY> ~略~ <FORM method="post" action="list.php"> <SELECT name='YY'><OPTION value='2005'>2005年</OPTION></SELECT> //2005~2016年まで選択可能 ~略~ <SELECT name='MM'><OPTION value='01'> 01月</OPTION></SELECT> // 01~12月まで選択可能 ~略~ <SELECT name='Yy'><OPTION value='2006'>2006年</OPTION></SELECT> //2006~2016年まで選択可能 ~略~ <SELECT name='Mm'><OPTION value='01'> 01月</OPTION></SELECT> // 01~12月まで選択可能 ~略~ <INPUT type="text" name="kensaku" > <INPUT type="submit" value="検索" > </FORM> </BODY> </HTML>
###list.php
<?php session_start(); ?> <HTML> <BODY> <?php require_once("MYDB.php"); $pdo=db_connect(); $YY = "{$_POST['YY']}"; $MM = "{$_POST['MM']}"; $Date = $YY . $MM; $Yy = "{$_POST['Yy']}"; $Mm = "{$_POST['Mm']}"; $date = $Yy . $Mm; $kensaku = "%{$_POST['kensaku']}%"; try{ $sql = "SELECT DISTINCT `name` FROM `product` WHERE `name` LIKE '$kensaku' AND `year`>='$Date' AND `year`<='$date' ORDER BY `name` ASC "; $stmh = $pdo->prepare($sql); $stmh ->bindValue(':kensaku',$kensaku,PDO::PARAM_STR); $stmh ->bindValue(':YY',$YY,PDO::PARAM_INT); $stmh ->bindValue(':MM',$MM,PDO::PARAM_INT); $stmh ->bindValue(':Yy',$Yy,PDO::PARAM_INT); $stmh ->bindValue(':Mm',$Mm,PDO::PARAM_INT); $stmh ->execute(); $count = $stmh->rowCount(); print "検索結果は".$count."件です" ; }catch(PDOException $Exception){ print"error:".$Exception->getMessage(); } if($count <1){ print"検索結果はありません"; }else{ ?> <TABLE> <TBODY> <?php while($row = $stmh ->fetch(PDO::FETCH_ASSOC)){ ?> <TR> <TD> <?=htmlspecialchars($row['name'])?> </TD> <TD> <FORM method = "post" action="detail.php" > <INPUT type ="hidden" name="YYY" value="<?=$Date?>"> <INPUT type ="hidden" name="Yyy" value="<?=$date?>"> <INPUT type ="hidden" name="product_name" value="<?=$row['name']?>"> <INPUT type ="submit" value="詳細"> </FORM> </TD> </TR> <?php } ?> </TBODY> </TABLE> <?php } ?> </BODY> </HTML>
###detail.php
<?php session_start(); ?> <HTML> <BODY> <?php require_once("MYDB.php"); $pdo=db_connect(); $YYY = "{$_POST['YYY']}"; $Yyy = "{$_POST['Yyy']}"; $product_name = "{$_POST['product_name']}"; try{ $sql = "SELECT `year`,`name`,`serial`,`area`,`price`,`note` FROM `product` WHERE `name` = '$product_name' AND `year`>='$YYY' AND `year`<='$Yyy' ORDER BY `year` DESC "; $sth = $pdo->prepare($sql); $sth ->bindValue(':product_name',$product_name,PDO::PARAM_STR); $sth ->bindValue(':YYY', $YYY,PDO::PARAM_INT); $sth ->bindValue(':Yyy', $Yyy,PDO::PARAM_INT); $sth ->execute(); $count = $sth->rowCount(); }catch(PDOException $Exception){ print'error:'.$Exception->getMessage(); } if($count <1){ print'検索結果はありません<BR>'; }else{ ?> <TABLE> <TBODY> <?php while($sin = $sth ->fetch(PDO::FETCH_ASSOC)){ ?> <TR> <TD><?=htmlspecialchars($sin['year']) ?>年</TD> <TD><?=htmlspecialchars($sin['name'])?></TD> <TD><?=htmlspecialchars($sin['serial'])?></TD> <TD><?=htmlspecialchars($sin['area'])?></TD> <TD><?=htmlspecialchars($sin['price'])?>円</TD> <TD><?=htmlspecialchars($sin['note'])?></TD> </TR> <?php } ?> </TBODY> </TABLE> <?php } ?> </BODY> </HTML>
###補足情報(言語/FW/ツール等のバージョンなど)
MySQL5.5
PHP5.6.22
回答4件
あなたの回答
tips
プレビュー