首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql自连接优化查询

MySql自连接优化查询
EN

Stack Overflow用户
提问于 2019-06-21 10:44:42
回答 1查看 124关注 0票数 1

我正在试图从我的数据库中找出一些垃圾数据,其中父级被删除,而子级没有被删除(只有一个级别)。为了解释这种情况,我提供了一些样本数据。

创建示例表的查询

代码语言:javascript
复制
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;

插入一些虚拟数据后,表如下所示

代码语言:javascript
复制
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

现在,我为查找第一级儿童的查询而形成的查询是

代码语言:javascript
复制
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;

我从这个查询得到的输出似乎很好。

代码语言:javascript
复制
Name    ParentName
Mango   Fruits
Apple   Fruits

但我担心的是性能,因为它的解释输出是不令人满意的。

代码语言:javascript
复制
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个记录。这里是对我的分期环境的解释。在我的生产环境中,有上百万行,所以我不能在巨大的数据上运行这个查询。

EN

回答 1

Stack Overflow用户

发布于 2019-06-21 10:48:50

一种索引策略将使用此索引:

代码语言:javascript
复制
CREATE INDEX idx2 ON parentchild (ParentID, IsDeleted, Name);

这将加快对parentchild的查找,在联接过程中从左到右。其他可能的战略是:

代码语言:javascript
复制
CREATE INDEX idx1 ON parentchild (ID, IsDeleted, Name);

如果MySQL决定这样做,这可能会加快连接的速度。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56701885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档