簡體   English   中英

MySql自聯接優化查詢

[英]MySql self join optimizing query

我試圖從我的數據庫中找出一些垃圾數據,其中刪除了父級但未刪除子級(僅一個級別)。 為了解釋這種情況,我提供了一些示例數據。

查詢創建樣本表

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)上添加索引但是沒有一個可以優化掃描。

在我的暫存環境中,該數據大約在1個lac行中,並且它正在掃描所有行以找出18條記錄,其父級已刪除但未刪除。 是我的暫存環境的說明。 在我的生產環境中,有一百萬行,因此我無法對大量數據運行此查詢。

一種索引策略將使用此索引:

CREATE INDEX idx2 ON parentchild (ParentID, IsDeleted, Name);

這將加快對parentchild的查找,在連接過程中從左到右。 另一種可能的策略是:

CREATE INDEX idx1 ON parentchild (ID, IsDeleted, Name);

如果MySQL決定這樣做,這可能會加快連接的速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM