2017-08-26 97 views
0

我在數據庫中有3個表。第一張表有150k條記錄,第二張表有175k條記錄,第三張表有210萬條記錄。我需要使用上面3個表格的輸出。所以我使用內部連接加入了上面的3個表,並且我得到了1.5k記錄的輸出,但需要8個小時的時間來執行。Mysql查詢性能問題與左連接

我在連接表中使用了主鍵。如何提高性能?

我已嘗試添加索引和下面是腳本&代碼

下面的表有15萬條記錄

CREATE TABLE `us_input_opp_oppheader` (
    `accountId` varchar(100) NOT NULL, 
    `accountName` varchar(200) DEFAULT NULL, 
    `objectId` varchar(100) NOT NULL, 
    `processType` varchar(100) DEFAULT NULL, 
    `description` varchar(250) DEFAULT NULL, 
    `noOfLines` int(11) DEFAULT NULL, 
    PRIMARY KEY (`accountId`,`objectId`), 
    KEY `objectId` 
    (`objectId`,`description`,`accountId`,`accountName`,`noOfLines`) 
    )ENGINE=InnoDB DEFAULT CHARSET=latin1; 

見下表具有175K記錄

CREATE TABLE `us_input_opp_oppitem` (
    `objectId` bigint(20) NOT NULL, 
    `createdBy` varchar(100) DEFAULT NULL, 
    `changedBy` varchar(100) DEFAULT NULL, 
    `numberInt` varchar(100) NOT NULL, 
    PRIMARY KEY (`objectId`,`numberInt`), 
    KEY `objectId` (`objectId`,`createdBy`,`changedBy`,`numberInt`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

下面表中有210萬記錄

CREATE TABLE `us_input_opp_oppsalesteam` (
    `transactionNumber` varchar(100) NOT NULL, 
    `item` varchar(100) NOT NULL, 
    `partnerFunction` varchar(100) DEFAULT NULL, 
    `partnerFunctionText` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`transactionNumber`,`item`), 
    KEY `item` (`item`,`partnerFunction`,`partnerFunctionText`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


SELECT oh.objectId, oh.description, oi.`createdBy`, oi.`changedBy`, oh.description, oh.processType, 
os.`item`, os.`partnerFunction`, os.`partnerFunctionText`  
FROM us_input_opp_oppheader oh 
LEFT join us_input_opp_oppitem oi ON oi.objectId = oh.objectId 
LEFT join us_input_opp_oppsalesteam os ON os.transactionNumber = oh.objectId 
WHERE (os.Item != 0 OR oh.noOfLines = 0) 
GROUP BY oh.objectId, oi.numberInt; 
+1

如果你把之前在查詢您的選擇解釋,你可以看到,如果你的索引將被用於需要更短的時間。 –

+0

你說沒有關於索引 –

+1

你有objectid/transactionnumber,'bigint(20)'和'varchar(100)''兩種不同的數據類型。它需要轉換並防止索引的有效使用,因此對這些(使用bigint)使用相同的類型。在這裏有一個索引'us_input_opp_oppitem(objectId,numberInt)'應該是有益的。更有益的是將解釋輸出添加到您的問題中(請參閱Remcos評論)。另外請注意,您的查詢將顯示非特定值。 'os.item',因爲它不在'group by'中。實際上,'os'甚至不是有效的別名,因此請確保使用正確的查詢。 – Solarflare

回答

0

我認爲這將是,如果你使用內連接或加入,而不是左連接