我有一个带有2196998条记录的表:
CREATE TABLE price ( dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, marketId INT, buy DOUBLE, sell DOUBLE, PRIMARY KEY (dt, marketId), FOREIGN KEY fk_price_market(marketId) REFERENCES market(id) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=INNODB;
查询
select max(buy) from price;
需要1.92秒,这是一个合理的时间,如果我在“购买”列上创建索引,则需要0.00秒:
CREATE INDEX idx_price_buy ON price (buy);
和查询
select count(*) from price where marketId=309;
花费0.05秒并返回160570。
但是查询
select max(buy) from price where marketId=309;
即使我创建了两个实例,也要花费15.49秒(这是非常大的):
CREATE INDEX idx_price_market ON price (marketId); CREATE INDEX idx_price_buy ON price (buy);
(我不确定,但是可能索引idx_price_market已经存在,因为marketId外键约束中需要列)
idx_price_market
marketId
1)有没有一种方法可以对其进行优化?
2)如果否,那么其他数据库呢?他们表现更好吗?
编辑1:
创建复合索引后
创建索引idx_price_market_buy开价(marketId,购买);
查询需要0.00秒。
desc select max(buy) from price where marketId=309; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ 1 row in set, 1 warning (0.01 sec)
在每一列上创建单独的索引可能不允许MySQL优化查询。
对于此查询,你想有一个 复合索引 上(marketId, buy)。
(marketId, buy)
create index idx_price_market_buy ON price (marketId, buy);
索引中各列的顺序很重要:首先对查询进行过滤marketId(因此,您希望此列位于Coumpound索引中的第一个位置), 然后 计算最大值buy。
buy