[英]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
我看到您希望doid
為NULL
並且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.