大家好,现有一问题真心求教,不慎感激
详细如下
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来分钟后自动消失掉,可能会是什么原因造成的了?
MySQL性能优化

解决方案 »

  1.   

    20分钟自动消失可能是mysql主动断掉连接了interactive_timeout
    wait_timeout
    这两个参数
      

  2.   

    ts<>0是否能过滤掉很多数据
      

  3.   

    round,floor如果是基于常数,比如总是 1000的话,则可以单独再放一个字段。然后创建索引。
      

  4.   


    不是基于常数的,都是类似于select round(ts/1000), from tb_tree group by round(ts/1000);的语句,主要是为了将时间戳按秒合并分组统计。
      

  5.   

    floor(ts):无法用到索引
    用字段保存floor(ts),在此字段上建立索引
      

  6.   


    不是基于常数的,都是类似于select round(ts/1000), from tb_tree group by round(ts/1000);的语句,主要是为了将时间戳按秒合并分组统计。如果都是 /1000, 那就把 ts/1000 单独再放一个字段。然后创建索引。