左连接的Mysql查询性能问题

时间:2017-08-26 08:42:13

标签: mysql

我在数据库中有3个表。第一个表有150k记录,第二个表有175k记录,第三个表有210万条记录。我需要使用上面3个表格的输出。所以我使用内部连接加入了3个表,我得到了1.5k记录的输出,但是执行需要8个小时。

我在连接表时使用了主键。如何提高性能?

我试图添加索引,下面是脚本&代码

下表有150k记录

 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 :(得分:0)

我认为如果你使用内连接或连接而不是左连接

,则需要更短的时间