mysql查询效率优化问题

l_9style 2013-05-29 10:59:53
大家好,现有一问题真心求教,不慎感激
详细如下
CREATE TABLE `tb_tree` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
`t` INT(11) NOT NULL COMMENT 't',
`lt` INT(11) NOT NULL COMMENT 'latency',
`ts` BIGINT(13) NOT NULL COMMENT 'Millisecond timestamp',
`s` VARCHAR(255) NOT NULL COMMENT 's',
`lb` VARCHAR(255) NOT NULL COMMENT 'label name',
`rc` VARCHAR(255) NOT NULL COMMENT 'response code ',
`rm` VARCHAR(2550) NOT NULL COMMENT 'response message',
`tn` VARCHAR(255) NOT NULL COMMENT 'thread name',
`dt` VARCHAR(255) NOT NULL COMMENT 'Content-Type ',
`bc` INT(11) NOT NULL COMMENT 'receiveBytes',
`assertion_name` VARCHAR(255) NULL DEFAULT NULL COMMENT 'raname',
`assertion_failure` VARCHAR(255) NULL DEFAULT NULL COMMENT 'rafailure',
`assertion_failure_message` VARCHAR(255) NULL DEFAULT NULL COMMENT 'assertion message',
`ng` INT(11) NOT NULL COMMENT 'number of active thread in the thread group',
`na` INT(11) NOT NULL COMMENT 'number of active thread in the test case',
`tgname` VARCHAR(255) NULL DEFAULT NULL COMMENT 'thread group name',
`machine_ip` VARCHAR(255) NULL DEFAULT NULL COMMENT 'the agent ip',
`response_data` LONGTEXT NULL COMMENT 'responsedata',
`sent_bytes` INT(11) NULL DEFAULT NULL COMMENT 'sentBytes',
`num_threads` INT(10) NULL DEFAULT NULL,
`ramp_time` INT(10) NULL DEFAULT NULL,
`script_name` VARCHAR(250) NULL DEFAULT NULL,
`url` VARCHAR(250) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `ts` (`ts`),
INDEX `t` (`t`),
INDEX `ts_lb` (`ts`, `lb`)
)
COMMENT='this is results of one test xml data'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

我的查询语句
select avg(t),floor(ts/1000),lb 
from tb_tree
where ts<>0
group by floor(ts),lb;


通过explain看到


对于类似这种,需要在group by后面使用round,floor等聚合函数的情况下,我始终无法使用到索引,怎样提高查询效率了?

另外再请问一下,我在一个存储过程中使用如上的sql语句,将结果保存在另外一张结果表中,因为源数据上亿,会莫名巧妙的出现该存储过程的进程在进过20来分钟后自动消失掉,可能会是什么原因造成的了?
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2013-05-29
  • 打赏
  • 举报
回复
floor(ts):无法用到索引 用字段保存floor(ts),在此字段上建立索引
l_9style 2013-05-29
  • 打赏
  • 举报
回复
引用 3 楼 ACMAIN_CHM 的回复:
round,floor 如果是基于常数,比如总是 1000的话,则可以单独再放一个字段。然后创建索引。
不是基于常数的,都是类似于select round(ts/1000), from tb_tree group by round(ts/1000);的语句,主要是为了将时间戳按秒合并分组统计。
l_9style 2013-05-29
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
ts<>0是否能过滤掉很多数据
只能过滤的很少一部分
ACMAIN_CHM 2013-05-29
  • 打赏
  • 举报
回复
round,floor 如果是基于常数,比如总是 1000的话,则可以单独再放一个字段。然后创建索引。
rucypli 2013-05-29
  • 打赏
  • 举报
回复
ts<>0是否能过滤掉很多数据
rucypli 2013-05-29
  • 打赏
  • 举报
回复
20分钟自动消失可能是mysql主动断掉连接了 interactive_timeout wait_timeout 这两个参数
ACMAIN_CHM 2013-05-29
  • 打赏
  • 举报
回复
引用 5 楼 l_9style 的回复:
[quote=引用 3 楼 ACMAIN_CHM 的回复:] round,floor 如果是基于常数,比如总是 1000的话,则可以单独再放一个字段。然后创建索引。
不是基于常数的,都是类似于select round(ts/1000), from tb_tree group by round(ts/1000);的语句,主要是为了将时间戳按秒合并分组统计。[/quote]如果都是 /1000, 那就把 ts/1000 单独再放一个字段。然后创建索引。
l_9style 2013-05-29
  • 打赏
  • 举报
回复
引用 6 楼 wwwwb 的回复:
floor(ts):无法用到索引 用字段保存floor(ts),在此字段上建立索引
这个方式还不错,我去尝试一下。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧