質問編集履歴
10
編集
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
|
-
|
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
|
-
|
52
|
+
WHERE `shop_table`.`status` = 1
|
50
|
-
|
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
|
-
|
61
|
+
$menu = $menu_res->fetchAll();
|
53
62
|
|
54
|
-
SELECT *
|
55
|
-
FROM `
|
63
|
+
$image_sql = "SELECT * FROM `shopimg_table`
|
56
|
-
|
64
|
+
WHERE `shopimg_table`.`status` = 1
|
57
|
-
|
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
編集
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
編集
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
|
-
|
42
|
+
$shop_ids = 取得したIDを配列に格納。
|
46
43
|
|
47
|
-
SELECT *
|
48
|
-
|
44
|
+
$shops = array();
|
49
|
-
|
45
|
+
foreach($shop_ids as $id){//下記ループ処理(マップ表示範囲の件数 最大2万件)
|
50
|
-
AND `menu_table`.`shop_id` = 1
|
51
46
|
|
52
|
-
SELECT *
|
47
|
+
SELECT *
|
53
|
-
FROM `
|
48
|
+
FROM `shop_table`
|
54
|
-
WHERE `
|
49
|
+
WHERE `shop_table`.`status` = 1
|
55
|
-
AND `
|
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
編集
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
編集
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
編集
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
|
-
|
11
|
+
2万件ほどの情報を取得しようとすると応答がなくなります。(1000件程度だと2秒ほどで、全マーカー表示できます。)
|
10
12
|
|
11
|
-
|
13
|
+
説明たらずや理解不足なことがあると思いますが、よろしくお願いいたします。
|
12
|
-
・マクドナルドのMAPのようなスピードにしたいなと思っています。[https://map.mcdonalds.co.jp/]
|
13
14
|
|
15
|
+
ーーーーーーーーーーーーーーーーーーーーーーーーー
|
16
|
+
・追加
|
14
17
|
|
15
18
|
データベース:mysql
|
16
|
-
|
19
|
+
|shop_table ||||||
|
20
|
+
|:--|:--|:--|
|
21
|
+
|ID|name|pref|address|category|status|LATITUDE|LONGITUDE|
|
17
22
|
|
23
|
+
|shopimg_table|||||
|
24
|
+
|:--|:--|:--|
|
18
|
-
|
25
|
+
|ID|shop_id|img_url|title|status|
|
19
26
|
|
27
|
+
|menu_table |||||||
|
28
|
+
|:--|:--|:--|
|
20
|
-
|
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
|
-
|
60
|
+
-------------
|
61
|
+
**phpMyAdminで、EXPLAINをSQL文の先頭に付けて実行した結果**
|
62
|
+
|
31
|
-
|
63
|
+
type => ref
|
32
|
-
|
64
|
+
key => status
|
65
|
+
rows => 5500
|
66
|
+
Extra => Using Where
|
67
|
+
|
68
|
+
ループ処理内の一文のsqlは、Extra => nullに変わっていました。
|
69
|
+
|
33
|
-
|
70
|
+
Using Whereでrowsが多い場合は、大半がWHERE句で絞り込まれるということなんですが、
|
71
|
+
インデックスがうまく施せていないのでしょうか。
|
72
|
+
|
73
|
+
------------
|
34
|
-
|
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
編集
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
|
-
|
7
|
+
・Google Mapsは、拡大縮小できるようにしています。マーカーが重なる場合APIのマーカークラスターを使って、近くのマーカーは1つのマーカーにし数字を表示しています。
|
7
|
-
データベースは、mysqlです。
|
8
|
-
phpとJavaScriptを使用しています。
|
9
|
-
php(ajax)でデータを取得して、データをJSONにしJSでマーカー処理をしています。
|
10
|
-
住所とは別に名前やステータスの項目もあり、検索機能をつけております。
|
11
8
|
|
12
|
-
|
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
編集
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
編集
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
編集
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のようなスピードにしたいなと思っています。
|