在mysql中使用avg的慢查询

时间:2011-12-14 12:51:32

标签: mysql average

我有这张桌子:

 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秒,具体取决于日期范围。运行时间似乎随着行数的增加而增加

我可以做些什么来改善这个?

我试过了:

  • 摆弄索引(将查询时间从最长13秒降至最长10秒)
  • 将存储移动到快速SAN(无论参数如何,查询时间都会缩短约0.1秒。)

查询运行时,服务器上的CPU和内存负载似乎不会太高。

1 个答案:

答案 0 :(得分:3)

快速SAN的表现要好得多 是因为您的查询需要复制到临时表,
并且需要对大型结果集进行文件排序。

你有五个令人讨厌的因素。

  • 范围查询
  • 基由
  • 排序
  • varchar 255 for object
  • 错误的索引

将时间戳分解为两个字段,

date, time

为对象构建另一个引用表,
所以,你使用整数,比如object_id(而不是varchar 255)来表示对象

重建

上的索引
date (date type), object_id

将查询更改为

where date IN('2011-12-13', '2011-12-14', ...)