大量のデータを取得して、GoogleMapにマーカーを全て表示したい。
約2万件の住所が入ったデータを「全件」取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
かなり重くなってしまい、解決案があれば教えていただきたいです。
2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
[Google Maps JavaScript API]を使用して、マーカーを表示しております。
マップの表示範囲内のみのデータを取得していますが、
ズームボタンで縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データが全件必要になり、
2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
ーーーーーーーーーーーーーーーーーーーーーーーーー
・追加
データベース:mysql
|shop_table ||||||
|:--|:--|:--|
|ID|name|pref|address|category|status|LATITUDE|LONGITUDE|
|shopimg_table|||||
|:--|:--|:--|
|ID|shop_id|img_url|title|status|
|menu_table |||||||
|:--|:--|:--|
|ID|shop_id|name|price|category|status|img_url|
*Ajaxで処理 //データベースに接続 $db = new PDO($dsn, $username, $password, $options); //現在のマップ表示範囲から検索 $search_sql = "SELECT `shop_table`.`ID` FROM `shop_table` WHERE `shop_table`.`status` = 1 AND `shop_table`.`LATITUDE` >= '33.643378363341014' AND `shop_table`.`LATITUDE` <= '37.62418548727742' AND `shop_table`.`LONGITUDE` >= '137.78986649375' AND `shop_table`.`LONGITUDE` <= '141.70099930625'" $search_res = $db->query($search_sql); $shop_ids = $search_res->fetchAll(); $shops = array(); foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件 をループ) $shop_sql = "SELECT * FROM `shop_table` WHERE `shop_table`.`status` = 1 AND `shop_table`.`ID` = $id" $shop_res = $db->query($shop_sql); $shop = $shop_res->fetchAll(); $menu_sql = "SELECT * FROM `menu_table` WHERE `menu_table`.`status` = 1 AND `menu_table`.`shop_id` = $id" $menu_res = $db->query($menu_sql); $menu = $menu_res->fetchAll(); $image_sql = "SELECT * FROM `shopimg_table` WHERE `shopimg_table`.`status` = 1 AND `shopimg_table`.`shop_id` = $id" $image_res = $db->query($image_sql); $image = $image_res->fetchAll(); $shops[$id][shop_name] = $shop[name] $shops[$id][shop_address] = $shop[address] ... $shops[$id][menu_name] = $menu[name] $shops[$id][menu_price] = $menu[price] ... $shops[$id][image_title] = $image[title] ... } //取得した情報を配列に置き換えて、Jsonにしています。 $shopsをJaonにして返す。
phpMyAdminで、EXPLAINをSQL文の先頭に付けて実行した結果
type => ref
key => status
rows => 5500
Extra => Using Where
ループ処理内の一文のsqlは、Extra => nullに変わっていました。
Using Whereでrowsが多い場合は、大半がWHERE句で絞り込まれるということなんですが、
インデックスがうまく施せていないのでしょうか。
microtime(true)の関数を使用して処理スピードを計測した結果
ループ処理内の全てのsqlの処理で、全体の9割の時間をとっていました。
3000件ほどで実行時、全ての処理が、約8.2秒
検索sql => (ほぼ0秒)
ループ処理内sql => (7秒)
(shop_table=>3.3,shopimg_table=>3.2,menu_table=>0.5)
ループ処理内配列格納 => (1秒)
jsonに変更 => (ほぼ0秒)
ループ処理で大半の時間がかかっていることが分かりました。
まず、ここのSQL文の組み立てを、変えていかないといけないかと思いますが、
どのようにすれば、パフォーマンス的にも良いでしょうか。
回答1件
あなたの回答
tips
プレビュー