質問編集履歴

2

ご指摘のあった通り、CREATE TABLE文と実行計画を記載しました。

2018/11/15 02:27

投稿

sanapapa
sanapapa

スコア30

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,36 @@
3
3
 
4
4
 
5
5
  Stock(在庫テーブル)
6
+
7
+
8
+
9
+ ```SQL
10
+
11
+ CREATE TABLE `Stock` (
12
+
13
+ `stock_id` INT(11) NOT NULL AUTO_INCREMENT,
14
+
15
+ `location_id` INT(11) NULL DEFAULT NULL,
16
+
17
+ `product_id` INT(11) NULL DEFAULT NULL,
18
+
19
+ `stock_num` INT(11) NULL DEFAULT NULL,
20
+
21
+ PRIMARY KEY (`stock_id`),
22
+
23
+ INDEX `location_id` (`location_id`, `product_id`)
24
+
25
+ )
26
+
27
+ COLLATE='utf8_general_ci'
28
+
29
+ ENGINE=InnoDB
30
+
31
+ ;
32
+
33
+ ```
34
+
35
+
6
36
 
7
37
  |stock_id|location_id|product_id|stock_num|
8
38
 
@@ -27,6 +57,28 @@
27
57
 
28
58
 
29
59
  BoughtStock(購入在庫)
60
+
61
+ ```SQL
62
+
63
+ CREATE TABLE `BoughtStock` (
64
+
65
+ `stock_id` INT(11) NULL DEFAULT NULL,
66
+
67
+ `bought_num` INT(11) NULL DEFAULT NULL,
68
+
69
+ INDEX `stock_id` (`stock_id`)
70
+
71
+ )
72
+
73
+ COLLATE='utf8_general_ci'
74
+
75
+ ENGINE=InnoDB
76
+
77
+ ROW_FORMAT=COMPACT
78
+
79
+ ;
80
+
81
+ ```
30
82
 
31
83
  ※購入されるたびにレコードが挿入される(stock_idは重複する)
32
84
 
@@ -106,6 +158,22 @@
106
158
 
107
159
 
108
160
 
161
+ 実行計画
162
+
163
+ |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
164
+
165
+ |:--|:--:|--:|
166
+
167
+ |1|PRIMARY|stk|index||location_id|10||8||
168
+
169
+ |3|DEPENDENT SUBQUERY|stk2|ref|location_id|location_id|5|func|1|Using where|
170
+
171
+ |2|DEPENDENT SUBQUERY|bst|ref|stock_id|stock_id|5|func|1|Using where|
172
+
173
+
174
+
175
+
176
+
109
177
  上記のSQLで**結果自体は問題ありません**し、EXPLAINで実行計画を取得しても**インデックスも効いている**のですが
110
178
 
111
179
  実際何千行の大量データで抽出すると**著しく速度が低下**します。

1

ご指摘のありました点修正させていただきました。まだ不足していればお手数ですが再度ご指摘くださいませ。

2018/11/15 02:27

投稿

sanapapa
sanapapa

スコア30

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,8 @@
28
28
 
29
29
  BoughtStock(購入在庫)
30
30
 
31
+ ※購入されるたびにレコードが挿入される(stock_idは重複する)
32
+
31
33
  |stock_id|bought_num|
32
34
 
33
35
  |:--|--:|
@@ -49,6 +51,12 @@
49
51
 
50
52
 
51
53
  このデータから↓のような結果を抽出しようとしています。
54
+
55
+ ・ロケ、商品ごとの在庫総数
56
+
57
+ ・引当総数(購入点数):そのロケのその商品が何点購入されているのかを抽出
58
+
59
+ ・ロケ内総在庫数(商品問わず):ロケ内の在庫を全商品ですべて合算する
52
60
 
53
61
 
54
62