質問編集履歴

10

編集

2021/05/14 05:46

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -62,25 +62,33 @@
62
62
 
63
63
  *Ajaxで処理
64
64
 
65
+
66
+
67
+ //データベースに接続
68
+
69
+ $db = new PDO($dsn, $username, $password, $options);
70
+
71
+
72
+
65
73
  //現在のマップ表示範囲から検索
66
74
 
75
+
76
+
67
- SELECT `shop_table`.`ID`
77
+ $search_sql = "SELECT `shop_table`.`ID` FROM `shop_table`
68
-
69
- FROM `shop_table`
78
+
70
-
71
- WHERE `shop_table`.`status` = 1
79
+ WHERE `shop_table`.`status` = 1
72
-
80
+
73
- AND `shop_table`.`LATITUDE` >= '33.643378363341014'
81
+ AND `shop_table`.`LATITUDE` >= '33.643378363341014'
74
-
82
+
75
- AND `shop_table`.`LATITUDE` <= '37.62418548727742'
83
+ AND `shop_table`.`LATITUDE` <= '37.62418548727742'
76
-
84
+
77
- AND `shop_table`.`LONGITUDE` >= '137.78986649375'
85
+ AND `shop_table`.`LONGITUDE` >= '137.78986649375'
78
-
86
+
79
- AND `shop_table`.`LONGITUDE` <= '141.70099930625'
87
+ AND `shop_table`.`LONGITUDE` <= '141.70099930625'"
88
+
80
-
89
+ $search_res = $db->query($search_sql);
81
-
82
-
90
+
83
- shop_ids = 取得したIDを配列に格納。
91
+ $shop_ids = $search_res->fetchAll();
84
92
 
85
93
 
86
94
 
@@ -90,45 +98,39 @@
90
98
 
91
99
 
92
100
 
93
- SELECT *
94
-
95
- FROM `shop_table`
101
+ $shop_sql = "SELECT * FROM `shop_table`
96
-
102
+
97
- WHERE `shop_table`.`status` = 1
103
+ WHERE `shop_table`.`status` = 1
98
-
104
+
99
- AND `shop_table`.`ID` = $id
105
+ AND `shop_table`.`ID` = $id"
106
+
100
-
107
+ $shop_res = $db->query($shop_sql);
101
-
102
-
108
+
103
- shop = IDから取得した1レコードを配列に格納。
109
+ $shop = $shop_res->fetchAll();
104
-
105
-
106
-
107
- SELECT *
110
+
108
-
111
+
112
+
109
- FROM `menu_table`
113
+ $menu_sql = "SELECT * FROM `menu_table`
110
-
114
+
111
- WHERE `menu_table`.`status` = 1
115
+ WHERE `menu_table`.`status` = 1
112
-
116
+
113
- AND `menu_table`.`shop_id` = $id
117
+ AND `menu_table`.`shop_id` = $id"
118
+
114
-
119
+ $menu_res = $db->query($menu_sql);
115
-
116
-
120
+
117
- menu = IDから取得した1レコードを配列に格納。
121
+ $menu = $menu_res->fetchAll();
118
-
119
-
120
-
121
- SELECT *
122
+
122
-
123
+
124
+
123
- FROM `shopimg_table`
125
+ $image_sql = "SELECT * FROM `shopimg_table`
124
-
126
+
125
- WHERE `shopimg_table`.`status` = 1
127
+ WHERE `shopimg_table`.`status` = 1
126
-
128
+
127
- AND `shopimg_table`.`shop_id` = $id
129
+ AND `shopimg_table`.`shop_id` = $id"
130
+
128
-
131
+ $image_res = $db->query($image_sql);
129
-
130
-
132
+
131
- image = IDから取得した1レコードを配列に格納。
133
+ $image = $image_res->fetchAll();
132
134
 
133
135
 
134
136
 

9

編集

2021/05/14 05:46

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
  $shops = array();
88
88
 
89
- foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件)
89
+ foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件 をループ
90
90
 
91
91
 
92
92
 

8

編集

2021/05/14 03:11

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -60,6 +60,8 @@
60
60
 
61
61
  ```
62
62
 
63
+ *Ajaxで処理
64
+
63
65
  //現在のマップ表示範囲から検索
64
66
 
65
67
  SELECT `shop_table`.`ID`
@@ -78,40 +80,84 @@
78
80
 
79
81
 
80
82
 
83
+ $shop_ids = 取得したIDを配列に格納。
84
+
85
+
86
+
87
+ $shops = array();
88
+
81
- //下記ループ処理(マップ表示範囲の件数 最大2万件)
89
+ foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件)
82
-
90
+
91
+
92
+
83
- SELECT *
93
+ SELECT *
84
-
94
+
85
- FROM `shop_table`
95
+ FROM `shop_table`
86
-
96
+
87
- WHERE `shop_table`.`status` = 1
97
+ WHERE `shop_table`.`status` = 1
88
-
98
+
89
- AND `shop_table`.`ID` = 1
99
+ AND `shop_table`.`ID` = $id
100
+
101
+
102
+
90
-
103
+ $shop = IDから取得した1レコードを配列に格納。
91
-
92
-
104
+
105
+
106
+
93
- SELECT *
107
+ SELECT *
94
-
108
+
95
- FROM `menu_table`
109
+ FROM `menu_table`
96
-
110
+
97
- WHERE `menu_table`.`status` = 1
111
+ WHERE `menu_table`.`status` = 1
98
-
112
+
99
- AND `menu_table`.`shop_id` = 1
113
+ AND `menu_table`.`shop_id` = $id
114
+
115
+
116
+
100
-
117
+ $menu = IDから取得した1レコードを配列に格納。
101
-
102
-
118
+
119
+
120
+
103
- SELECT *
121
+ SELECT *
104
-
122
+
105
- FROM `shopimg_table`
123
+ FROM `shopimg_table`
106
-
124
+
107
- WHERE `shopimg_table`.`status` = 1
125
+ WHERE `shopimg_table`.`status` = 1
108
-
126
+
109
- AND `shopimg_table`.`shop_id` = 1
127
+ AND `shopimg_table`.`shop_id` = $id
128
+
129
+
130
+
131
+ $image = IDから取得した1レコードを配列に格納。
132
+
133
+
134
+
135
+
136
+
137
+ $shops[$id][shop_name] = $shop[name]
138
+
139
+ $shops[$id][shop_address] = $shop[address]
140
+
141
+ ...
142
+
143
+ $shops[$id][menu_name] = $menu[name]
144
+
145
+ $shops[$id][menu_price] = $menu[price]
146
+
147
+ ...
148
+
149
+ $shops[$id][image_title] = $image[title]
150
+
151
+ ...
152
+
153
+ }
110
154
 
111
155
 
112
156
 
113
157
  //取得した情報を配列に置き換えて、Jsonにしています。
114
158
 
159
+ $shopsをJaonにして返す。
160
+
115
161
  ```
116
162
 
117
163
 

7

編集

2021/05/14 01:23

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -168,6 +168,6 @@
168
168
 
169
169
  ループ処理で大半の時間がかかっていることが分かりました。
170
170
 
171
- まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
171
+ まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
172
172
 
173
173
  どのようにすれば、パフォーマンス的にも良いでしょうか。

6

編集

2021/05/13 10:27

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -158,6 +158,8 @@
158
158
 
159
159
  ループ処理内sql => (7秒)
160
160
 
161
+ (shop_table=>3.3,shopimg_table=>3.2,menu_table=>0.5)
162
+
161
163
  ループ処理内配列格納 => (1秒)
162
164
 
163
165
  jsonに変更 => (ほぼ0秒)

5

編集

2021/05/13 10:25

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -8,62 +8,164 @@
8
8
 
9
9
 
10
10
 
11
+ 2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
12
+
11
13
  [Google Maps JavaScript API]を使用して、マーカーを表示しております。
12
-
13
- ・Google Mapsは、拡大縮小できるようにしています。マーカーが重なる場合APIのマーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
14
14
 
15
15
 
16
16
 
17
+ マップの表示範囲内のみのデータを取得していますが、
18
+
19
+ ズームボタンで縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データが全件必要になり、
20
+
17
- ・現在は、マップの表示範囲内のみのデータを取得していますが、縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データが全件必要になり、2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
21
+ 2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
18
22
 
19
23
 
20
24
 
21
- ・検索機能や、マーカーのポップ表示で、建物名などの項目も表示るので、住所データ以外にも2万件の建物名などのデータが必要になります。
25
+ 説明たらず理解不足なことがあると思いますがよろくお願いたします。
22
-
23
- ・マクドナルドのMAPのようなスピードにしたいなと思っています。[https://map.mcdonalds.co.jp/]
24
26
 
25
27
 
28
+
29
+ ーーーーーーーーーーーーーーーーーーーーーーーーー
30
+
31
+ ・追加
26
32
 
27
33
 
28
34
 
29
35
  データベース:mysql
30
36
 
31
- フレームワーク:CodeIgniter
37
+ |shop_table ||||||
38
+
39
+ |:--|:--|:--|
40
+
41
+ |ID|name|pref|address|category|status|LATITUDE|LONGITUDE|
32
42
 
33
43
 
34
44
 
45
+ |shopimg_table|||||
46
+
47
+ |:--|:--|:--|
48
+
35
- ajaxでデータを取得して、データをJSONにしJavaScriptでマーカー処理をしています。
49
+ |ID|shop_id|img_url|title|status|
36
50
 
37
51
 
38
52
 
53
+ |menu_table |||||||
54
+
55
+ |:--|:--|:--|
56
+
39
- ajaxで2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
57
+ |ID|shop_id|name|price|category|status|img_url|
40
58
 
41
59
 
42
60
 
61
+ ```
62
+
63
+ //現在のマップ表示範囲から検索
64
+
65
+ SELECT `shop_table`.`ID`
66
+
67
+ FROM `shop_table`
68
+
69
+ WHERE `shop_table`.`status` = 1
70
+
71
+ AND `shop_table`.`LATITUDE` >= '33.643378363341014'
72
+
73
+ AND `shop_table`.`LATITUDE` <= '37.62418548727742'
74
+
43
- 大量のデータを取得する処理は、どうしても時間がかかってしまうと思うので、それを回避したいと考えております。
75
+ AND `shop_table`.`LONGITUDE` >= '137.78986649375'
76
+
77
+ AND `shop_table`.`LONGITUDE` <= '141.70099930625'
44
78
 
45
79
 
46
80
 
47
- フレムワークを使ってアリケーションみたいなもを作成するのは初めてで、
81
+ //下記ループ処理(マップ表示範囲件数 最大2万件)
48
82
 
83
+ SELECT *
84
+
85
+ FROM `shop_table`
86
+
49
- 説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
87
+ WHERE `shop_table`.`status` = 1
88
+
89
+ AND `shop_table`.`ID` = 1
50
90
 
51
91
 
52
92
 
93
+ SELECT *
94
+
95
+ FROM `menu_table`
96
+
97
+ WHERE `menu_table`.`status` = 1
98
+
99
+ AND `menu_table`.`shop_id` = 1
53
100
 
54
101
 
55
102
 
103
+ SELECT *
104
+
105
+ FROM `shopimg_table`
106
+
107
+ WHERE `shopimg_table`.`status` = 1
108
+
109
+ AND `shopimg_table`.`shop_id` = 1
56
110
 
57
111
 
58
112
 
59
- jsonに返す処理
60
-
61
- ```Ajax
62
-
63
-  $this->output
64
-
65
- ->set_content_type('application/json')
113
+ //取得した情報を配列に置き換えて、Jsonにしています。
66
-
67
- ->set_output(json_encode($data));
68
114
 
69
115
  ```
116
+
117
+
118
+
119
+ -------------
120
+
121
+ **phpMyAdminで、EXPLAINをSQL文の先頭に付けて実行した結果**
122
+
123
+
124
+
125
+ type => ref
126
+
127
+ key => status
128
+
129
+ rows => 5500
130
+
131
+ Extra => Using Where
132
+
133
+
134
+
135
+ ループ処理内の一文のsqlは、Extra => nullに変わっていました。
136
+
137
+
138
+
139
+ Using Whereでrowsが多い場合は、大半がWHERE句で絞り込まれるということなんですが、
140
+
141
+ インデックスがうまく施せていないのでしょうか。
142
+
143
+
144
+
145
+ ------------
146
+
147
+ **microtime(true)の関数を使用して処理スピードを計測した結果**
148
+
149
+
150
+
151
+ ループ処理内の全てのsqlの処理で、全体の9割の時間をとっていました。
152
+
153
+ 3000件ほどで実行時、全ての処理が、約8.2秒
154
+
155
+
156
+
157
+ 検索sql => (ほぼ0秒)
158
+
159
+ ループ処理内sql => (7秒)
160
+
161
+ ループ処理内配列格納 => (1秒)
162
+
163
+ jsonに変更 => (ほぼ0秒)
164
+
165
+
166
+
167
+ ループ処理で大半の時間がかかっていることが分かりました。
168
+
169
+ まず、ここのSQL文の組み立てを、変えていかないといけないと思いますが、
170
+
171
+ どのようにすれば、パフォーマンス的にも良いでしょうか。

4

編集

2021/05/13 10:16

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -8,31 +8,35 @@
8
8
 
9
9
 
10
10
 
11
- GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。[Google Maps JavaScript API]
11
+ [Google Maps JavaScript API]を使用して、マーカーを表示しております。
12
12
 
13
- データベースは、mysqlです。
14
-
15
- phpとJavaScriptを使用しています。
16
-
17
- php(ajax)ータを取得して、タをJSONにしJSでマーカー処理をしています。
13
+ ・Google Mapsは、拡大縮小きるようにしています。マカーが重なる場合APIのマーカークラス使って、近くのマカーは1つのマーカーにし数字表示しています。
18
-
19
- 住所とは別に名前やステータスの項目もあり、検索機能をつけております。
20
14
 
21
15
 
22
16
 
23
- php(ajax)で2万件ほどの住所データを「全件取得する際に時間なりかかってしっています。
17
+ ・現在は、マップの表示範囲内のみのデータを取得していますが、縮小された時(日本地図が全てが範囲になったとき)に、2万件の住所データ全件必要になり、2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。
24
-
25
- 取得したJSONデーターからマーカーの設置は早く処理できています。
26
18
 
27
19
 
28
20
 
21
+ ・検索機能や、マーカーのポップ表示で、建物名などの項目も表示しているので、住所データ以外にも2万件の建物名などのデータが必要になります。
22
+
29
- マクドナルドのMAPのようなスピードにしたいなと思っています。
23
+ マクドナルドのMAPのようなスピードにしたいなと思っています。[https://map.mcdonalds.co.jp/]
30
24
 
31
25
 
32
26
 
33
- 1000件程度だと2秒ほどで、全マーカー表示できます。
34
27
 
35
28
 
29
+ データベース:mysql
30
+
31
+ フレームワーク:CodeIgniter
32
+
33
+
34
+
35
+ ajaxでデータを取得して、データをJSONにしJavaScriptでマーカー処理をしています。
36
+
37
+
38
+
39
+ ajaxで2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
36
40
 
37
41
 
38
42
 
@@ -40,11 +44,15 @@
40
44
 
41
45
 
42
46
 
47
+ フレームワークを使ってアプリケーションみたいなものを作成するのは初めてで、
48
+
49
+ 説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
43
50
 
44
51
 
45
52
 
46
53
 
47
- フレームワークに[CodeIgniter]を使用しています。
54
+
55
+
48
56
 
49
57
 
50
58
 

3

編集

2021/05/12 05:25

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 約2万件の住所が入ったデータを取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
5
+ 約2万件の住所が入ったデータを「全件」取得して、GoogleMapにAPIを使用してマーカーを全て表示したいのですが、
6
6
 
7
7
  かなり重くなってしまい、解決案があれば教えていただきたいです。
8
8
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- php(ajax)で2万件ほどの住所データを取得する際に時間がかなりかかってしまっています。
23
+ php(ajax)で2万件ほどの住所データを「全件」取得する際に時間がかなりかかってしまっています。
24
24
 
25
25
  取得したJSONデーターからマーカーの設置は早く処理できています。
26
26
 

2

編集

2021/05/12 03:37

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
 
11
- GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
11
+ GoogleMapのマーカーは、マーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。[Google Maps JavaScript API]
12
12
 
13
13
  データベースは、mysqlです。
14
14
 
@@ -27,3 +27,35 @@
27
27
 
28
28
 
29
29
  マクドナルドのMAPのようなスピードにしたいなと思っています。
30
+
31
+
32
+
33
+ 1000件程度だと2秒ほどで、全マーカー表示できます。
34
+
35
+
36
+
37
+
38
+
39
+ 大量のデータを取得する処理は、どうしても時間がかかってしまうと思うので、それを回避したいと考えております。
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ フレームワークに[CodeIgniter]を使用しています。
48
+
49
+
50
+
51
+ jsonに返す処理
52
+
53
+ ```Ajax
54
+
55
+  $this->output
56
+
57
+ ->set_content_type('application/json')
58
+
59
+ ->set_output(json_encode($data));
60
+
61
+ ```

1

編集

2021/05/12 03:26

投稿

fujiraidar
fujiraidar

スコア2

test CHANGED
File without changes
test CHANGED
@@ -17,3 +17,13 @@
17
17
  php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
18
18
 
19
19
  住所とは別に名前やステータスの項目もあり、検索機能をつけております。
20
+
21
+
22
+
23
+ php(ajax)で2万件ほどの住所データを取得する際に時間がかなりかかってしまっています。
24
+
25
+ 取得したJSONデーターからマーカーの設置は早く処理できています。
26
+
27
+
28
+
29
+ マクドナルドのMAPのようなスピードにしたいなと思っています。