2015-01-08 309 views
0

以下查詢花費很長時間才能運行,最終只是超時。我查看了EXPLAIN計劃,似乎並沒有使用我的一張表的索引,所以我認爲這與它有關,儘管我不知道爲什麼會發生這種情況。這裏的查詢:LEFT JOIN查詢速度很慢

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 

而這裏的解釋結果:

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表對所有選擇/連接列的索引,並document_links對所有列的索引。有人能看到我在這裏做錯了嗎?

UPDATE:表定義,請求。

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 
+0

請出示的'秀創建表feed_documents輸出;'和'顯示創建表document_links;'。 – Asaph

+0

'explain'看起來很合理 - 在第二張表上做索引查找。 'select'中不需要'document_links.doid'字段,但這可能不是問題。也許某些其他進程在表上存在鎖,影響了查詢性能。 –

+0

主要,獨特和索引如何? – EngineerCoder

回答

0

想通了。只需要在查詢了不同的方法:

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) 
0

我看你要doid在你的查詢NULLfeed_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 一個人留下您的查詢可能會很慢如果超時,可能一個或兩個表被其他查詢鎖定。