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

質問編集履歴

3

コード修正

2019/08/30 08:17

投稿

test_87097
test_87097

スコア47

title CHANGED
File without changes
body CHANGED
@@ -11,9 +11,11 @@
11
11
  ```
12
12
  このテーブルにcsvデータの流し込みで1億件のデータがあるとします。
13
13
  普通に
14
+ ```SQL
14
15
  SELECT * FROM `serials` where serial_code=1111111111111;
16
+ ```
15
17
  で検索すると検索に時間がかかってしまいます。explainで確認したところ
16
- ```ここに言語を入力
18
+ ```
17
19
  +----+-------------+---------+-------+---------------+------------+---------+------+----------+--------------------------+
18
20
  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
19
21
  +----+-------------+---------+-------+---------------+------------+---------+------+----------+--------------------------+
@@ -44,8 +46,11 @@
44
46
  UNIQUE KEY `serial_id` (`serial_id`)
45
47
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
46
48
  ```
47
- このテーブルに`serials`テーブルにはデータを流し込み、`serial_registration_histories`には`serials`テーブルには存在して`serial_registration_histories`にはないシリアル情報を格納するデータが存在しているのですが、この複数のテーブルに対して
49
+ このテーブルに`serials`テーブルにはデータを流し込み、`serial_registration_histories`には`serials`テーブルには存在して
50
+ ```SELECT文
51
+ `serial_registration_histories`にはないシリアル情報を格納するデータが存在しているのですが、この複数のテーブルに対して
48
52
  SELECT `Serial`.`id`, `SerialRegistrationHistory`.`id` FROM `テーブル名`.`serials` AS `Serial` LEFT JOIN `テーブル名`.`serial_registration_histories` AS `SerialRegistrationHistory` ON (`Serial`.`id` = `SerialRegistrationHistory`.`serial_id`) WHERE `Serial`.`serial_code` = '719653552612' LIMIT 1
53
+ ```
49
54
  このSQLを投げています。このSQLが遅くならなければいいのですが、これをexplainをつけると
50
55
  ```ここに言語を入力
51
56
  +----+-------------+---------------------------+-------+---------------+------------+---------+-------+------+----------------------+

2

結果の修正

2019/08/30 08:17

投稿

test_87097
test_87097

スコア47

title CHANGED
File without changes
body CHANGED
@@ -13,11 +13,13 @@
13
13
  普通に
14
14
  SELECT * FROM `serials` where serial_code=1111111111111;
15
15
  で検索すると検索に時間がかかってしまいます。explainで確認したところ
16
+ ```ここに言語を入力
16
- +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
17
+ +----+-------------+---------+-------+---------------+------------+---------+------+----------+--------------------------+
17
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
18
+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
18
- +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
19
+ +----+-------------+---------+-------+---------------+------------+---------+------+----------+--------------------------+
19
20
  | 1 | SIMPLE | serials | index | serial_code |serial_code | 36 | NULL | 40413015 | Using where; Using index |
20
- +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
21
+ +----+-------------+---------+-------+---------------+------------+---------+------+----------+--------------------------+
22
+ ```
21
23
  typeがindexとなりフルスキャンではないですがやはり遅くはなってしまいます。
22
24
  これをidで検索すると一瞬で表示され、typeもconstになります。
23
25
 
@@ -45,12 +47,14 @@
45
47
  このテーブルに`serials`テーブルにはデータを流し込み、`serial_registration_histories`には`serials`テーブルには存在して`serial_registration_histories`にはないシリアル情報を格納するデータが存在しているのですが、この複数のテーブルに対して
46
48
  SELECT `Serial`.`id`, `SerialRegistrationHistory`.`id` FROM `テーブル名`.`serials` AS `Serial` LEFT JOIN `テーブル名`.`serial_registration_histories` AS `SerialRegistrationHistory` ON (`Serial`.`id` = `SerialRegistrationHistory`.`serial_id`) WHERE `Serial`.`serial_code` = '719653552612' LIMIT 1
47
49
  このSQLを投げています。このSQLが遅くならなければいいのですが、これをexplainをつけると
50
+ ```ここに言語を入力
48
- +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
51
+ +----+-------------+---------------------------+-------+---------------+------------+---------+-------+------+----------------------+
49
- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
52
+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
50
- +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
53
+ +----+-------------+---------------------------+-------+---------------+------------+---------+-------+------+----------------------+
51
54
  | 1 | SIMPLE | Serial | const | serial_code | serial_code| 36 | const | 1 | Using index |
52
- | 1 | SIMPLE | SerialRegistrationHistory | const | serial_id | serial_id | 4 | const | 0 | unique row not found |
55
+ | 1 | SIMPLE | SerialRegistrationHistory | const | serial_id | serial_id | 4 | const | 0 | unique row not found |
53
- +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
56
+ +----+-------------+---------------------------+-------+---------------+------------+---------+-------+------+----------------------+
57
+ ```
54
58
  このような結果になってtypeがconstになっているのでそこまで遅くならないとは思うのですが正直なんで単純なsqlはindexでこれがconstになっているのか不明です。
55
59
 
56
60
  質問が多くなって申し訳ありませんが、よろしくお願いします

1

命名の修正。解決済みの記載

2019/08/30 08:01

投稿

test_87097
test_87097

スコア47

title CHANGED
File without changes
body CHANGED
@@ -4,19 +4,19 @@
4
4
  ```SQL
5
5
  CREATE TABLE IF NOT EXISTS `serials` (
6
6
  `id` int(11) NOT NULL auto_increment,
7
- `number` char(12) BINARY NOT NULL,
7
+ `serial_code` char(12) BINARY NOT NULL,
8
8
  PRIMARY KEY (`id`),
9
- UNIQUE KEY `number` (`number`)
9
+ UNIQUE KEY `serial_code` (`serial_code`)
10
10
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
11
11
  ```
12
12
  このテーブルにcsvデータの流し込みで1億件のデータがあるとします。
13
13
  普通に
14
- SELECT * FROM `serials` where number=1111111111111;
14
+ SELECT * FROM `serials` where serial_code=1111111111111;
15
15
  で検索すると検索に時間がかかってしまいます。explainで確認したところ
16
16
  +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
17
17
  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
18
18
  +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
19
- | 1 | SIMPLE | serials | index | number | number | 36 | NULL | 40413015 | Using where; Using index |
19
+ | 1 | SIMPLE | serials | index | serial_code |serial_code | 36 | NULL | 40413015 | Using where; Using index |
20
20
  +----+-------------+---------+-------+---------------+--------+---------+------+----------+--------------------------+
21
21
  typeがindexとなりフルスキャンではないですがやはり遅くはなってしまいます。
22
22
  これをidで検索すると一瞬で表示され、typeもconstになります。
@@ -28,9 +28,9 @@
28
28
  ```SQL
29
29
  CREATE TABLE IF NOT EXISTS `serials` (
30
30
  `id` int(11) NOT NULL auto_increment,
31
- `number` char(12) BINARY NOT NULL,
31
+ `serial_code` char(12) BINARY NOT NULL,
32
32
  PRIMARY KEY (`id`),
33
- UNIQUE KEY `number` (`number`)
33
+ UNIQUE KEY `serial_code` (`serial_code`)
34
34
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
35
35
 
36
36
  CREATE TABLE IF NOT EXISTS `serial_registration_histories` (
@@ -43,14 +43,19 @@
43
43
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
44
44
  ```
45
45
  このテーブルに`serials`テーブルにはデータを流し込み、`serial_registration_histories`には`serials`テーブルには存在して`serial_registration_histories`にはないシリアル情報を格納するデータが存在しているのですが、この複数のテーブルに対して
46
- SELECT `Serial`.`id`, `SerialRegistrationHistory`.`id` FROM `テーブル名`.`serials` AS `Serial` LEFT JOIN `テーブル名`.`serial_registration_histories` AS `SerialRegistrationHistory` ON (`Serial`.`id` = `SerialRegistrationHistory`.`serial_id`) WHERE `Serial`.`number` = '719653552612' LIMIT 1
46
+ SELECT `Serial`.`id`, `SerialRegistrationHistory`.`id` FROM `テーブル名`.`serials` AS `Serial` LEFT JOIN `テーブル名`.`serial_registration_histories` AS `SerialRegistrationHistory` ON (`Serial`.`id` = `SerialRegistrationHistory`.`serial_id`) WHERE `Serial`.`serial_code` = '719653552612' LIMIT 1
47
47
  このSQLを投げています。このSQLが遅くならなければいいのですが、これをexplainをつけると
48
48
  +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
49
49
  | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
50
50
  +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
51
- | 1 | SIMPLE | Serial | const | number | number | 36 | const | 1 | Using index |
51
+ | 1 | SIMPLE | Serial | const | serial_code | serial_code| 36 | const | 1 | Using index |
52
52
  | 1 | SIMPLE | SerialRegistrationHistory | const | serial_id | serial_id | 4 | const | 0 | unique row not found |
53
53
  +----+-------------+---------------------------+-------+---------------+-----------+---------+-------+------+----------------------+
54
54
  このような結果になってtypeがconstになっているのでそこまで遅くならないとは思うのですが正直なんで単純なsqlはindexでこれがconstになっているのか不明です。
55
55
 
56
- 質問が多くなって申し訳ありませんが、よろしくお願いします
56
+ 質問が多くなって申し訳ありませんが、よろしくお願いします
57
+
58
+
59
+ ※修正点
60
+ 命名が良くないと指摘を受けたので修正しました。(number→serial_code)
61
+ 頂いた回答から上半分の単純なSELECT文の検索が遅いと言う点は型変換を行って検索を行っているので遅いというのがわかりましたので解決済みです。