2017-08-26 28 views
0

データベースに3つのテーブルがあります。最初のテーブルには150kレコード、2番目のテーブルには175kレコード、3番目のテーブルには210万レコードがあります。上記の3つのテーブルを使って出力が必要です。だから私は内側の結合を使用して上記3テーブルに参加し、私は1.5kレコードで出力を得たが、それは実行するのに8時間かかります。左結合のMySQLクエリパフォーマンスの問題

テーブルを結合する際に主キーを使用しました。どのようにパフォーマンスを向上させるには?

&コード

表の下のスクリプトは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

クエリのSELECTの前にEXPLAINを置くと、インデックスが使用されるかどうかがわかります。 –

+0

あなたはindexについて何も言わない –

+1

あなたのobjectid/transactionnumberには、bigint(20)とvarchar(100)の2種類のデータ型があります。キャストが必要で、インデックスの効率的な使用が妨げられるので、同じタイプを使用してください(bigintが好ましい)。また、索引 'us_input_opp_oppitem(objectId、numberInt)'を持つことが有益であるはずです。もっと有益なことは、あなたの質問に説明出力を加えることです(Remcosコメントを参照)。また、クエリには、たとえば次のような不特定の値が表示されることにも注意してください。 'os.item'は、' group by'にはありません。実際、 'os'は有効なエイリアスではないので、正しいクエリを使用してください。 – Solarflare

答えて

0

左結合の代わりに内側結合または結合を使用すると短時間かかると思う