質問: ### データーベースの検索表示の速度を速くするには? 下記のようにMySQLで作成したデーターベースから、HTMLフォームに製品名を入力、 プルダウンメニューで期間を選択してデータ検索するプログラムを作成しています。 テーブル名:product フィールド1:id id番号 int (主キー) フィールド2:name 製品名 varchar (インデックス) フィールド3:year 製造年月 int フィールド4:serial シリアル varchar フィールド5:area 地域 varchar フィールド6:price 価格 int フィールド7:note 特記 varchar 全データー数(1のid)は約250.000 製品名数(2のname) は約 50.000 ディスク使用量合計 37,968 KiB 下記のように2段階で検索表示させています。 1) 期間を選択し、検索(あいまい検索)で一致した製品名リストを表で表示させる。 製品名A 「詳細」ボタン 製品名B 「詳細」ボタン 製品名C 「詳細」ボタン ・ ・ ・ 2) 各製品名リスト毎にに設置した「詳細」ボタンをクリックし各製品の詳細情報を表示させる。同名の製品名の詳細が複数表示されます。 製品名A 製造年月 シリアル 地域 価格 特記 製品名A 製造年月 シリアル 地域 価格 特記 ・ ・ ・ 問題は、1)の検索結果数が多いと、2)の検索結果表示が遅くなります。 1)の検索結果数が500くらいだと、2)の検索結果も比較的スムーズに表示されますが、 1)の検索結果数が3000以上になると、2)の検索結果表示は30秒ほどもかかります。 1)の検索を、前方一致や後方一致で絞込んでを数を減らすとスムーズに表示されます。 検索の対象となるフィールドが増えると遅くなるのでしょうか? どこが問題なのか分からず質問させていただきました。 ご指導のほどよろしくお願いいたします。 プログラムは下記の通りです。 index.php list.php detail.php ### index.php ``` ~略~ 2005年 //2005~2016年まで選択可能 ~略~ 01月 // 01~12月まで選択可能 ~略~ 2006年 //2006~2016年まで選択可能 ~略~ 01月 // 01~12月まで選択可能 ~略~ ``` ### list.php ```
回答: > > 問題は、1)の検索結果数が多いと、2)の検索結果表示が遅くなります。 > > > list.phpへの表示商品が多いと、detail.phpの応答が遅いということですよね? これはたまたまで、この現象は常には再現しないと思います。 もしこれが本当に原因なら、ブラウザがメモリスワップ起こして落ちかけているのではないかと (list.phpの表示件数にかかわり無く、製品別にdetail.phpが重くなったり軽くなったりしているのでは?) 考えられる原因は次の2つですが、 1. 適切なindexが無いから 2. detail.phpの表示データ量が多すぎる 勘ですが、常にではなく遅いケースと早いケースがあるところから大きく影響してるのは「2」ではないかと思います。試しにdetail.phpのSQLをこう代えると、常に軽くなるんじゃないでしょうか? ``` SELECT `year`,`name`,`serial`,`area`,`price`,`note` FROM `product` WHERE `name` = '$product_name' AND `year`>='$YYY' AND `year`<='$Yyy' ORDER BY `year` DESC LIMIT 20" ``` テーブルは商品に対する何かの履歴ですよね?(入庫出庫か売り上げか) 品によってはSQLの抽出結果が数千件になってるのでは? noteの要素は名前からしてデータ量が多そうですし。