首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中使用avg的慢速查询

在mysql中使用avg的慢速查询
EN

Stack Overflow用户
提问于 2011-12-14 12:51:32
回答 1查看 1.9K关注 0票数 1

我有一张桌子:

代码语言:javascript
复制
 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万行,我正在运行以下查询:

代码语言:javascript
复制
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和内存负载似乎不会太高。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-14 13:23:22

fast SAN表现更好的原因是

是因为您的查询要求复制到临时表,

并需要对大型结果集进行文件排序。

你有五个讨厌的因素。

对象的query

  • group-by

  • sorting

  • varchar 255
  • range
  • 错误的索引

把时间戳分解成两个字段,

代码语言:javascript
复制
date, time

为对象构建另一个引用表,

因此,您可以使用整数,例如object_id (而不是varchar 255)来表示对象。

重新建立索引

代码语言:javascript
复制
date (date type), object_id

将查询更改为

代码语言:javascript
复制
where date IN('2011-12-13', '2011-12-14', ...)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8504790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档