我有这张桌子:
CREATE TABLE `table1` (
`object` varchar(255) NOT NULL,
`score` decimal(10,3) NOT NULL,
`timestamp` datetime NOT NULL
KEY `ex` (`object`,`score`,`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
有910万行,我正在运行以下查询:
SELECT `object`, `timestamp`, AVG(score) as avgs
from `table1`
where timestamp >= '2011-12-14'
AND timestamp <= '2011-12-13'
group by `object`
order by `avgs` ASC limit 100;
日期来自用户输入。查询需要6-10秒,具体取决于日期范围。运行时间似乎随着行数的增加而增加
我可以做些什么来改善这个?
我试过了:
查询运行时,服务器上的CPU和内存负载似乎不会太高。
答案 0 :(得分:3)
快速SAN的表现要好得多
是因为您的查询需要复制到临时表,
并且需要对大型结果集进行文件排序。
你有五个令人讨厌的因素。
将时间戳分解为两个字段,
date, time
为对象构建另一个引用表,
所以,你使用整数,比如object_id(而不是varchar 255)来表示对象
重建
上的索引date (date type), object_id
将查询更改为
where date IN('2011-12-13', '2011-12-14', ...)