2012-02-29 11 views
0

私はこのクエリをMySqlの低速クエリログに表示しています。 (それは遅くはないが、右の索引を使用していない)。私はインデックスを正しく設定する方法についていくつかの助けが必要です。このMySqlクエリに正しいインデックスを設定するにはどうすればよいですか?

SELECT tbladded.amount*SUM(tbladdeditem.amount) 
FROM tbladded 
INNER JOIN tbladdeditem ON tbladded.addedid = tbladdeditem.addedid AND tbladdeditem.deleted='False' 
WHERE tbladded.userid=100 
AND tbladded.date='2012-01-01' 
AND tbladded.deleted='False' 
GROUP BY tbladded.addedid 


id select_type table   type possible_keys  key   key_len ref    rows Extra 
1 SIMPLE  tbladded  ref PRIMARY,userid_date userid_date 8  const,const  1  Using where 
1 SIMPLE  tbladdeditem ref addedid    addedid  5  tbladded.addedid 1  Using where 

これは、テーブルがどのように見えるかです:

CREATE TABLE `tbladded` (
    `addedid` int(11) NOT NULL AUTO_INCREMENT, 
    `amount` double DEFAULT NULL, 
    `date` date DEFAULT NULL, 
    `userid` mediumint(9) DEFAULT NULL, 
    `deleted` enum('False','True') CHARACTER SET latin1 DEFAULT 'False', 
    PRIMARY KEY (`addedid`), 
    KEY `userid_date` (`userid`,`date`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `tbladdeditem` (
    `addeditemid` int(11) NOT NULL AUTO_INCREMENT, 
    `amount` double DEFAULT NULL, 
    `addedid` int(11) DEFAULT NULL, 
    `userid` mediumint(9) DEFAULT NULL, 
    `deleted` enum('False','True') CHARACTER SET latin1 DEFAULT 'False', 
    PRIMARY KEY (`addeditemid`), 
    KEY `addedid` (`addedid`), 
    KEY `userid` (`userid`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

は、あなたの 'GROUP BY tbladded.addedid' neccessaryですか? – user1027167

+0

@ user1027167ああ、申し訳ありませんが、GROUP BYが必要です。私はSUM()をクエリーで見逃していました。 – Martin

答えて

1

これを試してみてください。

ALTER TABLE `tbladded` ADD INDEX 
`tbladdedIndex` (`userid`, `date`, `deleted`); 
+0

はい、インデックスに「削除済み」を追加することも考えましたが、「ユーザーID」と「日付」を使用することが重要であるかどうかは不明でした。たぶん "削除"を追加するだけで不必要ですか? – Martin

関連する問題