我有两个表PARENT和CHILD。父母与孩子有一对多的关系。 PARENT表分别具有300000和CHILD具有1500000行。具有某些ID的行会频繁插入和删除,删除大约需要20秒。 CHILD表中的删除执行计划显示整个表扫描。为什么删除索引字段需要花费时间?
更新-1
父级和子级的表架构
show create table parent;
| Table | Create Table | parent | CREATE TABLE `parent` (
`id` bigint(20) NOT NULL,
`name` varchar(500) COLLATE latin1_general_cs DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs |
show create table child;
| Table | Create Table | child | CREATE TABLE `child` (
`id` bigint(20) NOT NULL,
`value` varchar(2000) COLLATE latin1_general_cs DEFAULT NULL,
KEY `child_cons` (`id`),
CONSTRAINT `child_cons` FOREIGN KEY (`id`) REFERENCES `parent` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs |
更新-2
使用的删除语句是
delete from child where id=1;
执行计划
explain delete from child where id=1;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | child | ALL | child_cons | NULL | NULL | NULL | 1350398 | Using where |
设置1行(0.00秒)
更新-3
子表仅包含5行,其中id = 1