MySQLのバージョンは8.0.17になります。
下記のようなSQLを実行しようとしております。
Mysql
1SELECT * FROM abc_data a 2LEFT JOIN user_data b ON a.abc_code = b.abc_code
こちらを実行するのに現在数分程度かかっております。
それぞれのテーブルのおおよそのレコード数は下記の通りになります。
abc_data:7560行程度
user_data:86000行程度
上記のSQLの実行計画ですが下記の通りとなります。
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | a | ALL | 7560 | 100 | ||||||
1 | SIMPLE | b | ALL | abc_code | 87656 | 100 | Range checked for each record (index map: 0x4) |
また、user_dataのabc_codeは
abc_codeあり:3200行程度
abc_codeがブランク:82800行程度
となっております。(abc_codeなしのレコードはabc_codeがnullではなくブランクです。)
user_dataテーブルのabc_codeがブランクが多すぎるせいで
abc_codeのインデックスが使用されずuser_dataのフルスキャンが走るせいでレスポンスが低下していると推測しております。
そこで下記のようにJOINする際にabc_codeを使用するようにしてみました。
Mysql
1SELECT * FROM abc_data a 2LEFT JOIN user_data b FORCE INDEX FOR JOIN (abc_code) ON a.abc_code = b.abc_code
上記の実行結果がこちらになります。
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | a | ALL | 7560 | 100 | ||||||
1 | SIMPLE | b | ALL | abc_code | 87656 | 100 | Range checked for each record (index map: 0x4) |
結果、先ほどと変わらずuser_dataのフルスキャンが走る形となっております。
可能であればuser_dataの値を変えたりすることなくインデックスを効かせ
レスポンスを改善させたいのですが、何か方法はございますでしょうか。
不要な情報を全て削ったabc_data,user_dataを作成するSQLは下記になります。
こちらで上述のSQLを実行した際にuser_dataのabc_codeのインデックスを使用し検索が実行したい、という要望になります。
Mysql
1CREATE TABLE `abc_data` ( 2 `rowid` int(11) NOT NULL AUTO_INCREMENT, 3 `abc_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '', 4 PRIMARY KEY (`rowid`) USING BTREE, 5 INDEX `abc_code`(`abc_code`) USING BTREE 6) ENGINE = MyISAM AUTO_INCREMENT = 7820 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic; 7 8INSERT INTO `abc_data` VALUES (1, 'ABCD'); 9INSERT INTO `abc_data` VALUES (2, 'EFGH'); 10INSERT INTO `abc_data` VALUES (3, 'SETH'); 11INSERT INTO `abc_data` VALUES (4, 'EYUK'); 12INSERT INTO `abc_data` VALUES (5, 'ROPN'); 13INSERT INTO `abc_data` VALUES (6, 'SEKB'); 14INSERT INTO `abc_data` VALUES (7, 'HORP'); 15INSERT INTO `abc_data` VALUES (8, 'XKEM'); 16INSERT INTO `abc_data` VALUES (9, 'EOIF'); 17INSERT INTO `abc_data` VALUES (10, 'EMSO');
Mysql
1CREATE TABLE `user_data` ( 2 `userid` int(11) NOT NULL AUTO_INCREMENT, 3 `abc_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '', 4 PRIMARY KEY (`userid`) USING BTREE, 5 INDEX `abc_code`(`abc_code`) USING BTREE 6) ENGINE = InnoDB AUTO_INCREMENT = 100400622 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; 7 8INSERT INTO `user_data` VALUES (1, ''); 9INSERT INTO `user_data` VALUES (2, ''); 10INSERT INTO `user_data` VALUES (3, ''); 11INSERT INTO `user_data` VALUES (4, ''); 12INSERT INTO `user_data` VALUES (5, ''); 13INSERT INTO `user_data` VALUES (6, ''); 14INSERT INTO `user_data` VALUES (7, ''); 15INSERT INTO `user_data` VALUES (8, ''); 16INSERT INTO `user_data` VALUES (9, ''); 17INSERT INTO `user_data` VALUES (10, ''); 18INSERT INTO `user_data` VALUES (11, ''); 19INSERT INTO `user_data` VALUES (12, ''); 20INSERT INTO `user_data` VALUES (13, ''); 21INSERT INTO `user_data` VALUES (14, ''); 22INSERT INTO `user_data` VALUES (15, ''); 23INSERT INTO `user_data` VALUES (16, ''); 24INSERT INTO `user_data` VALUES (17, ''); 25INSERT INTO `user_data` VALUES (18, ''); 26INSERT INTO `user_data` VALUES (19, ''); 27INSERT INTO `user_data` VALUES (20, ''); 28INSERT INTO `user_data` VALUES (21, ''); 29INSERT INTO `user_data` VALUES (22, ''); 30INSERT INTO `user_data` VALUES (23, ''); 31INSERT INTO `user_data` VALUES (24, ''); 32INSERT INTO `user_data` VALUES (25, ''); 33INSERT INTO `user_data` VALUES (26, ''); 34INSERT INTO `user_data` VALUES (27, ''); 35INSERT INTO `user_data` VALUES (28, ''); 36INSERT INTO `user_data` VALUES (29, ''); 37INSERT INTO `user_data` VALUES (30, ''); 38INSERT INTO `user_data` VALUES (31, ''); 39INSERT INTO `user_data` VALUES (32, ''); 40INSERT INTO `user_data` VALUES (33, ''); 41INSERT INTO `user_data` VALUES (34, ''); 42INSERT INTO `user_data` VALUES (35, ''); 43INSERT INTO `user_data` VALUES (36, ''); 44INSERT INTO `user_data` VALUES (37, ''); 45INSERT INTO `user_data` VALUES (38, ''); 46INSERT INTO `user_data` VALUES (39, ''); 47INSERT INTO `user_data` VALUES (40, ''); 48INSERT INTO `user_data` VALUES (41, ''); 49INSERT INTO `user_data` VALUES (42, ''); 50INSERT INTO `user_data` VALUES (43, ''); 51INSERT INTO `user_data` VALUES (44, ''); 52INSERT INTO `user_data` VALUES (45, ''); 53INSERT INTO `user_data` VALUES (46, ''); 54INSERT INTO `user_data` VALUES (47, ''); 55INSERT INTO `user_data` VALUES (48, ''); 56INSERT INTO `user_data` VALUES (49, ''); 57INSERT INTO `user_data` VALUES (50, ''); 58INSERT INTO `user_data` VALUES (51, ''); 59INSERT INTO `user_data` VALUES (52, ''); 60INSERT INTO `user_data` VALUES (53, ''); 61INSERT INTO `user_data` VALUES (54, ''); 62INSERT INTO `user_data` VALUES (55, ''); 63INSERT INTO `user_data` VALUES (56, ''); 64INSERT INTO `user_data` VALUES (57, ''); 65INSERT INTO `user_data` VALUES (58, ''); 66INSERT INTO `user_data` VALUES (59, ''); 67INSERT INTO `user_data` VALUES (60, ''); 68INSERT INTO `user_data` VALUES (61, ''); 69INSERT INTO `user_data` VALUES (62, ''); 70INSERT INTO `user_data` VALUES (63, ''); 71INSERT INTO `user_data` VALUES (64, ''); 72INSERT INTO `user_data` VALUES (65, ''); 73INSERT INTO `user_data` VALUES (66, ''); 74INSERT INTO `user_data` VALUES (67, 'DKEO'); 75INSERT INTO `user_data` VALUES (70, 'DKEO'); 76INSERT INTO `user_data` VALUES (68, 'EMSK'); 77INSERT INTO `user_data` VALUES (69, 'LOES');
回答2件
あなたの回答
tips
プレビュー