質問編集履歴
10
編集
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
|
-
|
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
|
-
|
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
|
-
|
109
|
+
$shop = $shop_res->fetchAll();
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
-
|
121
|
+
$menu = $menu_res->fetchAll();
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
-
|
133
|
+
$image = $image_res->fetchAll();
|
132
134
|
|
133
135
|
|
134
136
|
|
9
編集
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
編集
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` =
|
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` =
|
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` =
|
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
編集
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
編集
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
編集
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
|
-
|
21
|
+
2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
|
18
22
|
|
19
23
|
|
20
24
|
|
21
|
-
|
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
|
-
|
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
|
-
|
49
|
+
|ID|shop_id|img_url|title|status|
|
36
50
|
|
37
51
|
|
38
52
|
|
53
|
+
|menu_table |||||||
|
54
|
+
|
55
|
+
|:--|:--|:--|
|
56
|
+
|
39
|
-
a
|
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
|
-
|
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
編集
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,31 +8,35 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
|
11
|
+
[Google Maps JavaScript API]を使用して、マーカーを表示しております。
|
12
12
|
|
13
|
-
データベースは、mysqlです。
|
14
|
-
|
15
|
-
phpとJavaScriptを使用しています。
|
16
|
-
|
17
|
-
p
|
13
|
+
・Google Mapsは、拡大縮小できるようにしています。マーカーが重なる場合APIのマーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
|
18
|
-
|
19
|
-
住所とは別に名前やステータスの項目もあり、検索機能をつけております。
|
20
14
|
|
21
15
|
|
22
16
|
|
23
|
-
|
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
|
-
|
54
|
+
|
55
|
+
|
48
56
|
|
49
57
|
|
50
58
|
|
3
編集
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
編集
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
編集
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のようなスピードにしたいなと思っています。
|