質問編集履歴
3
コード修正
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`テーブルには存在して
|
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
結果の修正
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
|
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
|
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
|
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
命名の修正。解決済みの記載
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
|
-
`
|
7
|
+
`serial_code` char(12) BINARY NOT NULL,
|
8
8
|
PRIMARY KEY (`id`),
|
9
|
-
UNIQUE KEY `
|
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
|
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 |
|
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
|
-
`
|
31
|
+
`serial_code` char(12) BINARY NOT NULL,
|
32
32
|
PRIMARY KEY (`id`),
|
33
|
-
UNIQUE KEY `
|
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`.`
|
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 |
|
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文の検索が遅いと言う点は型変換を行って検索を行っているので遅いというのがわかりましたので解決済みです。
|