teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

10

編集

2021/05/14 05:46

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -30,42 +30,43 @@
30
30
 
31
31
  ```
32
32
  *Ajaxで処理
33
+
34
+ //データベースに接続
35
+ $db = new PDO($dsn, $username, $password, $options);
36
+
33
37
  //現在のマップ表示範囲から検索
34
- SELECT `shop_table`.`ID`
35
- FROM `shop_table`
36
- WHERE `shop_table`.`status` = 1
37
- AND `shop_table`.`LATITUDE` >= '33.643378363341014'
38
- AND `shop_table`.`LATITUDE` <= '37.62418548727742'
39
- AND `shop_table`.`LONGITUDE` >= '137.78986649375'
40
- AND `shop_table`.`LONGITUDE` <= '141.70099930625'
41
38
 
39
+ $search_sql = "SELECT `shop_table`.`ID` FROM `shop_table`
40
+ WHERE `shop_table`.`status` = 1
41
+ AND `shop_table`.`LATITUDE` >= '33.643378363341014'
42
+ AND `shop_table`.`LATITUDE` <= '37.62418548727742'
43
+ AND `shop_table`.`LONGITUDE` >= '137.78986649375'
44
+ AND `shop_table`.`LONGITUDE` <= '141.70099930625'"
45
+ $search_res = $db->query($search_sql);
42
- shop_ids = 取得したIDを配列に格納。
46
+ $shop_ids = $search_res->fetchAll();
43
47
 
44
48
  $shops = array();
45
49
  foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件 をループ)
46
50
 
47
- SELECT *
48
- FROM `shop_table`
51
+ $shop_sql = "SELECT * FROM `shop_table`
49
- WHERE `shop_table`.`status` = 1
52
+ WHERE `shop_table`.`status` = 1
50
- AND `shop_table`.`ID` = $id
53
+ AND `shop_table`.`ID` = $id"
54
+ $shop_res = $db->query($shop_sql);
55
+ $shop = $shop_res->fetchAll();
51
56
 
57
+ $menu_sql = "SELECT * FROM `menu_table`
58
+ WHERE `menu_table`.`status` = 1
59
+ AND `menu_table`.`shop_id` = $id"
60
+ $menu_res = $db->query($menu_sql);
52
- $shop = IDから取得した1レコードを配列に格納。
61
+ $menu = $menu_res->fetchAll();
53
62
 
54
- SELECT *
55
- FROM `menu_table`
63
+ $image_sql = "SELECT * FROM `shopimg_table`
56
- WHERE `menu_table`.`status` = 1
64
+ WHERE `shopimg_table`.`status` = 1
57
- AND `menu_table`.`shop_id` = $id
65
+ AND `shopimg_table`.`shop_id` = $id"
66
+ $image_res = $db->query($image_sql);
67
+ $image = $image_res->fetchAll();
58
68
 
59
- $menu = IDから取得した1レコードを配列に格納。
60
69
 
61
- SELECT *
62
- FROM `shopimg_table`
63
- WHERE `shopimg_table`.`status` = 1
64
- AND `shopimg_table`.`shop_id` = $id
65
-
66
- $image = IDから取得した1レコードを配列に格納。
67
-
68
-
69
70
  $shops[$id][shop_name] = $shop[name]
70
71
  $shops[$id][shop_address] = $shop[address]
71
72
  ...

9

編集

2021/05/14 05:46

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -42,7 +42,7 @@
42
42
  $shop_ids = 取得したIDを配列に格納。
43
43
 
44
44
  $shops = array();
45
- foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件)
45
+ foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件 をループ
46
46
 
47
47
  SELECT *
48
48
  FROM `shop_table`

8

編集

2021/05/14 03:11

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -29,6 +29,7 @@
29
29
  |ID|shop_id|name|price|category|status|img_url|
30
30
 
31
31
  ```
32
+ *Ajaxで処理
32
33
  //現在のマップ表示範囲から検索
33
34
  SELECT `shop_table`.`ID`
34
35
  FROM `shop_table`
@@ -38,23 +39,45 @@
38
39
  AND `shop_table`.`LONGITUDE` >= '137.78986649375'
39
40
  AND `shop_table`.`LONGITUDE` <= '141.70099930625'
40
41
 
41
- //下記ループ処理(マップ表示範囲の件数 最大2万件)
42
- SELECT *
43
- FROM `shop_table`
44
- WHERE `shop_table`.`status` = 1
45
- AND `shop_table`.`ID` = 1
42
+ $shop_ids = 取得したIDを配列に格納。
46
43
 
47
- SELECT *
48
- FROM `menu_table`
44
+ $shops = array();
49
- WHERE `menu_table`.`status` = 1
45
+ foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件)
50
- AND `menu_table`.`shop_id` = 1
51
46
 
52
- SELECT *
47
+ SELECT *
53
- FROM `shopimg_table`
48
+ FROM `shop_table`
54
- WHERE `shopimg_table`.`status` = 1
49
+ WHERE `shop_table`.`status` = 1
55
- AND `shopimg_table`.`shop_id` = 1
50
+ AND `shop_table`.`ID` = $id
56
51
 
52
+ $shop = IDから取得した1レコードを配列に格納。
53
+
54
+ SELECT *
55
+ FROM `menu_table`
56
+ WHERE `menu_table`.`status` = 1
57
+ AND `menu_table`.`shop_id` = $id
58
+
59
+ $menu = IDから取得した1レコードを配列に格納。
60
+
61
+ SELECT *
62
+ FROM `shopimg_table`
63
+ WHERE `shopimg_table`.`status` = 1
64
+ AND `shopimg_table`.`shop_id` = $id
65
+
66
+ $image = IDから取得した1レコードを配列に格納。
67
+
68
+
69
+ $shops[$id][shop_name] = $shop[name]
70
+ $shops[$id][shop_address] = $shop[address]
71
+ ...
72
+ $shops[$id][menu_name] = $menu[name]
73
+ $shops[$id][menu_price] = $menu[price]
74
+ ...
75
+ $shops[$id][image_title] = $image[title]
76
+ ...
77
+ }
78
+
57
79
  //取得した情報を配列に置き換えて、Jsonにしています。
80
+ $shopsをJaonにして返す。
58
81
  ```
59
82
 
60
83
  -------------

7

編集

2021/05/14 01:23

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -83,5 +83,5 @@
83
83
  jsonに変更 => (ほぼ0秒)
84
84
 
85
85
  ループ処理で大半の時間がかかっていることが分かりました。
86
- まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
86
+ まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
87
87
  どのようにすれば、パフォーマンス的にも良いでしょうか。

6

編集

2021/05/13 10:27

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -78,6 +78,7 @@
78
78
 
79
79
  検索sql => (ほぼ0秒)
80
80
  ループ処理内sql => (7秒)
81
+ (shop_table=>3.3,shopimg_table=>3.2,menu_table=>0.5)
81
82
  ループ処理内配列格納 => (1秒)
82
83
  jsonに変更 => (ほぼ0秒)
83
84
 

5

編集

2021/05/13 10:25

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -3,33 +3,84 @@
3
3
  約2万件の住所が入ったデータを「全件」取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
4
4
  かなり重くなってしまい、解決案があれば教えていただきたいです。
5
5
 
6
+ 2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
6
7
  [Google Maps JavaScript API]を使用して、マーカーを表示しております。
7
- ・Google Mapsは、拡大縮小できるようにしています。マーカーが重なる場合APIのマーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
8
8
 
9
+ マップの表示範囲内のみのデータを取得していますが、
10
+ ズームボタンで縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データが全件必要になり、
9
- ・現在は、マップの表示範囲内のみのデータを取得していますが、縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データが全件必要になり、2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
11
+ 2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
10
12
 
11
- ・検索機能、マーカーのポップ表示で、建物名どの項目も表示していので、住所データ以外にも2万件の建物名などのデータ必要になります。
13
+ 説明たらず理解不足ことがあと思います、よろしくお願いいたします。
12
- ・マクドナルドのMAPのようなスピードにしたいなと思っています。[https://map.mcdonalds.co.jp/]
13
14
 
15
+ ーーーーーーーーーーーーーーーーーーーーーーーーー
16
+ ・追加
14
17
 
15
18
  データベース:mysql
16
- フレームワーク:CodeIgniter
19
+ |shop_table ||||||
20
+ |:--|:--|:--|
21
+ |ID|name|pref|address|category|status|LATITUDE|LONGITUDE|
17
22
 
23
+ |shopimg_table|||||
24
+ |:--|:--|:--|
18
- ajaxでデータを取得して、データをJSONにしJavaScriptでマーカー処理をしています。
25
+ |ID|shop_id|img_url|title|status|
19
26
 
27
+ |menu_table |||||||
28
+ |:--|:--|:--|
20
- ajaxで2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
29
+ |ID|shop_id|name|price|category|status|img_url|
21
30
 
31
+ ```
32
+ //現在のマップ表示範囲から検索
33
+ SELECT `shop_table`.`ID`
34
+ FROM `shop_table`
35
+ WHERE `shop_table`.`status` = 1
36
+ AND `shop_table`.`LATITUDE` >= '33.643378363341014'
37
+ AND `shop_table`.`LATITUDE` <= '37.62418548727742'
22
- 大量のデータを取得する処理は、どうしても時間がかかってしまうと思うので、それを回避したいと考えております。
38
+ AND `shop_table`.`LONGITUDE` >= '137.78986649375'
39
+ AND `shop_table`.`LONGITUDE` <= '141.70099930625'
23
40
 
24
- フレムワークを使ってアリケーションみたいなもを作成するのは初めてで、
41
+ //下記ループ処理(マップ表示範囲件数 最大2万件)
42
+ SELECT *
43
+ FROM `shop_table`
25
- 説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
44
+ WHERE `shop_table`.`status` = 1
45
+ AND `shop_table`.`ID` = 1
26
46
 
47
+ SELECT *
48
+ FROM `menu_table`
49
+ WHERE `menu_table`.`status` = 1
50
+ AND `menu_table`.`shop_id` = 1
27
51
 
52
+ SELECT *
53
+ FROM `shopimg_table`
54
+ WHERE `shopimg_table`.`status` = 1
55
+ AND `shopimg_table`.`shop_id` = 1
28
56
 
57
+ //取得した情報を配列に置き換えて、Jsonにしています。
58
+ ```
29
59
 
30
- jsonに返す処理
60
+ -------------
61
+ **phpMyAdminで、EXPLAINをSQL文の先頭に付けて実行した結果**
62
+
31
- ```Ajax
63
+ type => ref
32
-  $this->output
64
+ key => status
65
+ rows => 5500
66
+ Extra => Using Where
67
+
68
+ ループ処理内の一文のsqlは、Extra => nullに変わっていました。
69
+
33
- ->set_content_type('application/json')
70
+ Using Whereでrowsが多い場合は、大半がWHERE句で絞り込まれるということなんですが、
71
+ インデックスがうまく施せていないのでしょうか。
72
+
73
+ ------------
34
- ->set_output(json_encode($data));
74
+ **microtime(true)の関数を使用して処理スピードを計測した結果**
75
+
76
+ ループ処理内の全てのsqlの処理で、全体の9割の時間をとっていました。
77
+ 3000件ほどで実行時、全ての処理が、約8.2秒
78
+
35
- ```
79
+ 検索sql => (ほぼ0秒)
80
+ ループ処理内sql => (7秒)
81
+ ループ処理内配列格納 => (1秒)
82
+ jsonに変更 => (ほぼ0秒)
83
+
84
+ ループ処理で大半の時間がかかっていることが分かりました。
85
+ まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
86
+ どのようにすれば、パフォーマンス的にも良いでしょうか。

4

編集

2021/05/13 10:16

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -3,26 +3,30 @@
3
3
  約2万件の住所が入ったデータを「全件」取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
4
4
  かなり重くなってしまい、解決案があれば教えていただきたいです。
5
5
 
6
+ [Google Maps JavaScript API]を使用して、マーカーを表示しております。
6
- GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。[Google Maps JavaScript API]
7
+ ・Google Mapsは、拡大縮小できるようにしています。マーカーが重なる場合APIのマーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
7
- データベースは、mysqlです。
8
- phpとJavaScriptを使用しています。
9
- php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
10
- 住所とは別に名前やステータスの項目もあり、検索機能をつけております。
11
8
 
12
- php(ajax)で2万件ほどの住所データを「全件取得する際に時間なりかかってしっています。
9
+ ・現在は、マップの表示範囲内のみのデータを取得していますが、縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データ全件必要になり、2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。
13
- 取得したJSONデーターからマーカーの設置は早く処理できています。
14
10
 
11
+ ・検索機能や、マーカーのポップ表示で、建物名などの項目も表示しているので、住所データ以外にも2万件の建物名などのデータが必要になります。
15
- マクドナルドのMAPのようなスピードにしたいなと思っています。
12
+ マクドナルドのMAPのようなスピードにしたいなと思っています。[https://map.mcdonalds.co.jp/]
16
13
 
17
- 1000件程度だと2秒ほどで、全マーカー表示できます。
18
14
 
15
+ データベース:mysql
16
+ フレームワーク:CodeIgniter
19
17
 
18
+ ajaxでデータを取得して、データをJSONにしJavaScriptでマーカー処理をしています。
19
+
20
+ ajaxで2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
21
+
20
22
  大量のデータを取得する処理は、どうしても時間がかかってしまうと思うので、それを回避したいと考えております。
21
23
 
24
+ フレームワークを使ってアプリケーションみたいなものを作成するのは初めてで、
25
+ 説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
22
26
 
23
27
 
24
- フレームワークに[CodeIgniter]を使用しています。
25
28
 
29
+
26
30
  jsonに返す処理
27
31
  ```Ajax
28
32
   $this->output

3

編集

2021/05/12 05:25

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 大量のデータを取得して、GoogleMapにマーカーを全て表示したい。
2
2
 
3
- 約2万件の住所が入ったデータを取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
3
+ 約2万件の住所が入ったデータを「全件」取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
4
4
  かなり重くなってしまい、解決案があれば教えていただきたいです。
5
5
 
6
6
  GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。[Google Maps JavaScript API]
@@ -9,7 +9,7 @@
9
9
  php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
10
10
  住所とは別に名前やステータスの項目もあり、検索機能をつけております。
11
11
 
12
- php(ajax)で2万件ほどの住所データを取得する際に時間がかなりかかってしまっています。
12
+ php(ajax)で2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
13
13
  取得したJSONデーターからマーカーの設置は早く処理できています。
14
14
 
15
15
  マクドナルドのMAPのようなスピードにしたいなと思っています。

2

編集

2021/05/12 03:37

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  約2万件の住所が入ったデータを取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
4
4
  かなり重くなってしまい、解決案があれば教えていただきたいです。
5
5
 
6
- GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
6
+ GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。[Google Maps JavaScript API]
7
7
  データベースは、mysqlです。
8
8
  phpとJavaScriptを使用しています。
9
9
  php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
@@ -12,4 +12,20 @@
12
12
  php(ajax)で2万件ほどの住所データを取得する際に時間がかなりかかってしまっています。
13
13
  取得したJSONデーターからマーカーの設置は早く処理できています。
14
14
 
15
- マクドナルドのMAPのようなスピードにしたいなと思っています。
15
+ マクドナルドのMAPのようなスピードにしたいなと思っています。
16
+
17
+ 1000件程度だと2秒ほどで、全マーカー表示できます。
18
+
19
+
20
+ 大量のデータを取得する処理は、どうしても時間がかかってしまうと思うので、それを回避したいと考えております。
21
+
22
+
23
+
24
+ フレームワークに[CodeIgniter]を使用しています。
25
+
26
+ jsonに返す処理
27
+ ```Ajax
28
+  $this->output
29
+ ->set_content_type('application/json')
30
+ ->set_output(json_encode($data));
31
+ ```

1

編集

2021/05/12 03:26

投稿

fujiraidar
fujiraidar

スコア2

title CHANGED
File without changes
body CHANGED
@@ -7,4 +7,9 @@
7
7
  データベースは、mysqlです。
8
8
  phpとJavaScriptを使用しています。
9
9
  php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
10
- 住所とは別に名前やステータスの項目もあり、検索機能をつけております。
10
+ 住所とは別に名前やステータスの項目もあり、検索機能をつけております。
11
+
12
+ php(ajax)で2万件ほどの住所データを取得する際に時間がかなりかかってしまっています。
13
+ 取得したJSONデーターからマーカーの設置は早く処理できています。
14
+
15
+ マクドナルドのMAPのようなスピードにしたいなと思っています。