簡體   English   中英

LEFT JOIN查詢太慢了,它超時了

[英]LEFT JOIN query is so slow it times out

下面的查詢花費了很長時間才能運行,最終最終超時了。 我查看了EXPLAIN計划,似乎它沒有使用我的一張表的索引,因此盡管我不確定為什么會這樣,但我認為這與它有關。 這是查詢:

SELECT documentID
     , coID
     , suiteID
     , leaseID
     , assetID
     , vendorID
     , feed_documents.did
     , document_links.doid
  FROM feed_documents
  LEFT 
  JOIN document_links 
    ON feed_documents.did = document_links.doid
 WHERE doid IS NULL
 LIMIT 0, 75000

這是EXPLAIN的結果:

id  select_type table           type  possible_keys key   key_len ref                               rows    Extra
1   SIMPLE      feed_documents  ALL   NULL          NULL  NULL    119363                            NULL    NULL
1   SIMPLE      document_links  ref   doid          doid  4       rladmin_rlhpsi.feed_documents.did 12      Using where; Not exists; Using index

feed_documents表在所有select / join列上都有索引,而document_links在所有列上都有索引。 有人可以在這里看到我做錯了嗎?

更新:根據請求定義表。

CREATE TABLE `feed_documents` (
 `documentID` int(11) NOT NULL DEFAULT '0',
 `documentTitle` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
 `documentFileName` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
 `documentDate` datetime DEFAULT NULL,
 `documentArchived` int(11) DEFAULT NULL,
 `documentTypeID` int(11) DEFAULT NULL,
 `coID` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
 `suiteID` int(11) DEFAULT NULL,
 `leaseID` int(11) DEFAULT NULL,
 `assetID` int(11) DEFAULT NULL,
 `vendorID` int(11) DEFAULT NULL,
 `did` int(11) DEFAULT NULL,
 PRIMARY KEY (`documentID`),
 KEY `coID` (`coID`),
 KEY `suiteID` (`suiteID`),
 KEY `leaseID` (`leaseID`),
 KEY `assetID` (`assetID`),
 KEY `vendorID` (`vendorID`),
 KEY `did` (`did`),
 KEY `documentTypeID` (`documentTypeID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


CREATE TABLE `document_links` (
 `dlid` int(11) NOT NULL AUTO_INCREMENT,
 `daid` int(11) NOT NULL COMMENT 'Dataset ID',
 `linkid` int(11) NOT NULL COMMENT 'ID value of linked item',
 `doid` int(11) NOT NULL COMMENT 'Document ID',
 PRIMARY KEY (`dlid`),
 KEY `daid` (`daid`),
 KEY `linkid` (`linkid`),
 KEY `doid` (`doid`)
) ENGINE=MyISAM AUTO_INCREMENT=148767 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我看到您希望doidNULL並且feed_documents.did = document_links.doid

據我理解,這意味着join所有行feed_documents.did = null到所有行document_links.doid 這是多對多的關系,並且查詢速度很慢也就不足為奇了,特別是如果feed_documents中有多行的did = null和document_links中有多行的doid = null

如果在第一個表中有n匹配行,在第二個表中有m匹配行,則結果集將包含n*m行,具體取決於您的數據。

無論哪種方式,為什么一次需要75000行?

PS不理會您的查詢可能會很慢,如果超時,則一個或兩個表可能已被另一個查詢鎖定。

弄清楚了。 只是需要一種不同的查詢方法:

SELECT documentID, coID, suiteID, leaseID, assetID, vendorID, feed_documents.did
FROM feed_documents
WHERE feed_documents.did NOT IN (
    SELECT DISTINCT feed_documents.did
    FROM feed_documents
    JOIN document_links ON feed_documents.did = document_links.doid )

暫無
暫無

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

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