我正在试图从我的数据库中找出一些垃圾数据,其中父级被删除,而子级没有被删除(只有一个级别)。为了解释这种情况,我提供了一些样本数据。
创建示例表的查询
CREATE TABLE `parentchild` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parentid` int(10) unsigned DEFAULT NULL,
`Name` varchar(45) NOT NULL,
`IsDeleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE,
KEY `FK_parentchild_Self` (`parentid`) USING BTREE,
CONSTRAINT `FK_parentchild_Self` FOREIGN KEY (`parentid`) REFERENCES `parentchild` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;插入一些虚拟数据后,表如下所示
id parentid Name IsDeleted
1 Fruits 1
2 1 Mango 0
3 1 Apple 0
4 Car 0
5 4 Baleno 0
6 4 Santro 0
7 Animals 0
8 7 Dog 0
9 7 Cat 0现在,我为查找第一级儿童的查询而形成的查询是
SELECT t2.Name AS Name, t1.Name AS ParentName FROM parentchild t1
INNER JOIN parentchild t2 ON t1.ID=t2.ParentID
WHERE t1.IsDeleted=1 AND t2.IsDeleted=0;我从这个查询得到的输出似乎很好。
Name ParentName
Mango Fruits
Apple Fruits但我担心的是性能,因为它的解释输出是不令人满意的。
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL PRIMARY 8 12.50 Using where
1 SIMPLE t2 ref FK_parentchild_Self FK_parentchild_Self 5 test1.t1.id 2 2 12.50 Using where有人能让我知道正确的索引或更好的查询吗?
我尝试过在Index(id,IsDeleted),Index(parentid,IsDeleted)和Index(id,parentid,IsDeleted)上添加索引,但是没有一个能优化扫描。
在我的暂存环境中,这个数据大约是1lac行,它正在扫描所有行,以找出父记录被删除但它们没有被删除的18个记录。这里是对我的分期环境的解释。在我的生产环境中,有上百万行,所以我不能在巨大的数据上运行这个查询。
发布于 2019-06-21 10:48:50
一种索引策略将使用此索引:
CREATE INDEX idx2 ON parentchild (ParentID, IsDeleted, Name);这将加快对parentchild的查找,在联接过程中从左到右。其他可能的战略是:
CREATE INDEX idx1 ON parentchild (ID, IsDeleted, Name);如果MySQL决定这样做,这可能会加快连接的速度。
https://stackoverflow.com/questions/56701885
复制相似问题