2012-02-29 132 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 2012-02-29 12:40:42

+0

@ user1027167对不起,GROUP BY是需要的,我错过了查询中的SUM()。 – Martin 2012-03-01 09:19:27

回答

1

试试这个:

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

是的,我曾考虑将“已删除”添加到索引中,但我不确定它是否重要,因为使用“userid”,“date”只会给出5-10个结果。也许增加“删除”然后是没有必要的? – Martin 2012-03-01 09:22:47