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

質問編集履歴

2

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

2018/11/15 02:27

投稿

sanapapa
sanapapa

スコア30

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,21 @@
1
1
  例えば下記のような2つのテーブルがあるとします。
2
2
 
3
3
  Stock(在庫テーブル)
4
+
5
+ ```SQL
6
+ CREATE TABLE `Stock` (
7
+ `stock_id` INT(11) NOT NULL AUTO_INCREMENT,
8
+ `location_id` INT(11) NULL DEFAULT NULL,
9
+ `product_id` INT(11) NULL DEFAULT NULL,
10
+ `stock_num` INT(11) NULL DEFAULT NULL,
11
+ PRIMARY KEY (`stock_id`),
12
+ INDEX `location_id` (`location_id`, `product_id`)
13
+ )
14
+ COLLATE='utf8_general_ci'
15
+ ENGINE=InnoDB
16
+ ;
17
+ ```
18
+
4
19
  |stock_id|location_id|product_id|stock_num|
5
20
  |:--|:--:|--:|
6
21
  |1|100|1000|5|
@@ -13,6 +28,17 @@
13
28
  |8|101|2000|4|
14
29
 
15
30
  BoughtStock(購入在庫)
31
+ ```SQL
32
+ CREATE TABLE `BoughtStock` (
33
+ `stock_id` INT(11) NULL DEFAULT NULL,
34
+ `bought_num` INT(11) NULL DEFAULT NULL,
35
+ INDEX `stock_id` (`stock_id`)
36
+ )
37
+ COLLATE='utf8_general_ci'
38
+ ENGINE=InnoDB
39
+ ROW_FORMAT=COMPACT
40
+ ;
41
+ ```
16
42
  ※購入されるたびにレコードが挿入される(stock_idは重複する)
17
43
  |stock_id|bought_num|
18
44
  |:--|--:|
@@ -52,6 +78,14 @@
52
78
  ORDER BY stk.location_id, stk.product_id
53
79
  ```
54
80
 
81
+ 実行計画
82
+ |id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
83
+ |:--|:--:|--:|
84
+ |1|PRIMARY|stk|index||location_id|10||8||
85
+ |3|DEPENDENT SUBQUERY|stk2|ref|location_id|location_id|5|func|1|Using where|
86
+ |2|DEPENDENT SUBQUERY|bst|ref|stock_id|stock_id|5|func|1|Using where|
87
+
88
+
55
89
  上記のSQLで**結果自体は問題ありません**し、EXPLAINで実行計画を取得しても**インデックスも効いている**のですが
56
90
  実際何千行の大量データで抽出すると**著しく速度が低下**します。
57
91
 

1

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

2018/11/15 02:27

投稿

sanapapa
sanapapa

スコア30

title CHANGED
File without changes
body CHANGED
@@ -13,6 +13,7 @@
13
13
  |8|101|2000|4|
14
14
 
15
15
  BoughtStock(購入在庫)
16
+ ※購入されるたびにレコードが挿入される(stock_idは重複する)
16
17
  |stock_id|bought_num|
17
18
  |:--|--:|
18
19
  |1|1|
@@ -24,6 +25,9 @@
24
25
  |3|1|
25
26
 
26
27
  このデータから↓のような結果を抽出しようとしています。
28
+ ・ロケ、商品ごとの在庫総数
29
+ ・引当総数(購入点数):そのロケのその商品が何点購入されているのかを抽出
30
+ ・ロケ内総在庫数(商品問わず):ロケ内の在庫を全商品ですべて合算する
27
31
 
28
32
  |ロケーションID|商品ID|在庫数|引当総数|ロケ内総在庫数|
29
33
  |:--|:--:|--:|