我下面的查询需要超过两分钟,我不知道哪个索引是最好的提高性能:
SELECT COUNT(sid), COUNT(DISTINCT(cid)), shop
FROM forwarding
WHERE fDate BETWEEN '2011-06-01' AND '2011-06-30'
GROUP BY shop;
EXPLAIN结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sal_forwarding index forwardDate,forwardDate_2,forwardDate_3,forwardDate_4,forwardDate_5 f_shop 40 (NULL) 2448997 Using where; Using index
键f_shop具有如下结构:(f_shop, forwardDate, cid)
什么是最好的索引,以提高我的查询性能?
非常感谢。
更新:下面是表Create Statement:
CREATE TABLE `forwarding` (
`sid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`f_shop` INT(11) NOT NULL,
`f_offer` INT(11) DEFAULT NULL,
`cid` CHAR(32) DEFAULT NULL,
`f_partner` VARCHAR(20) NOT NULL,
.
.
.
+8-10
.
.
.
`fDate` DATE NOT NULL,
PRIMARY KEY (`sid`),
KEY `f_shop` (`f_shop`,`fDate`,`cid`),
KEY `f_partner` (`f_partner`,`fDate`),
KEY `fDate` (`fDate`,`cid`),
KEY `fDate_2` (`fDate`,`f_shop`),
KEY `fDate_3` (`fDate`,`f_shop`,`f_partner`),
KEY `fDate_4` (`fDate`,`f_partner`,`cid`),
KEY `fDate_5` (`fDate`,`f_affiliateId`)
) ENGINE=INNODB AUTO_INCREMENT=10747233 DEFAULT CHARSET=latin1
实际上有超过500万行
你需要一个复合索引
ALTER TABLE forwarding ADD INDEX shopdate (shop, fDate)
什么是最好的索引,以提高我的查询性能?
a 集群主键
http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/MySQL和NoSQL:帮我选择正确的一个
6000万条目,选择某月份的条目。如何优化数据库?
如何避免"使用临时的"在多对多查询中?
然而,您当前的集群PK sid不会有太大帮助,所以尝试以下内容:
create table forwarding
(
f_date date not null,
f_shop int unsigned not null,
sid int unsigned not null, -- added for uniqueness
...
primary key (f_date, f_shop, sid) -- clustered primary key
)
engine=innodb;
希望有帮助
为商店列建立索引,您可以在这里实现的另一件事是使用按日期分区,您的查询将运行得很快
我认为您需要一个forwardDate的键,因为这是查询的WHERE子句中使用的唯一属性。
编辑正如在其他答案中所指出的,在shop和forwardDate上创建复合索引是可行的方法。由于单行格式,我错过了查询的最后一部分。