数据库表  百万--千万条记录级别
CREATE TABLE `ch1` (
  `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `no` int(10) unsigned DEFAULT NULL,
  `dtime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);
要求功能: 按月统计总量,
使用的查询语句 select sum(no) as number,dtime as date from ch2 group by month(dtime)
请教的问题: 效率太低,大约需要20s到50s,希望能够提高效率,有什么办法,最好能够具体点。我建立过一个索引 在 no和 dtime列上的组合索引,但是用了几百秒。
请教解决方案。
例如使用等价的sql语句,存储过程之类的,

解决方案 »

  1.   

    1、首先提一个设计上的建议,最好把每月统计的结果但存放在一张表中,这样下次查询不必要在查统计了。
    2千万级数据擦操作时会慢点,但不会慢这么离谱。建立多列索引,用explain看你的索引起效了没?
      

  2.   

    如果你已经有了(dtime,no)这个索引(注意两个字段的顺序)则已经是最优化的了。
      

  3.   

    select sum(no) as number,dtime as date from ch1 group by month(dtime) 
    这条语句用不上索引,因为索引在group by 有聚合函数(sum(no))的时候不起作用。 
    索引在这里不好用,建议统计改为触发器,然后按要求触发单独存放在一张统计表,以后直接查统计表
      

  4.   

    select sum(no) as number,dtime as date from ch2 group by month(dtime)这个语句中没有任何WHERE条件子句,所以总归是要进行全表扫描。
      

  5.   

    我的实际设计是这样的:表
       CREATE TABLE `viewsource` (
      `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, //主键
      `src_ip` int(11) NOT NULL,//源Ip
      `dest_ip` int(11) NOT NULL,//目的IP
      `time` datetime NOT NULL,// 时间
      `value` int(11) NOT NULL,//流量值
      PRIMARY KEY (`id`)
    )
    要求查询的东西:
    按时间(可能 年 月 日 小时)统计流量 
       (以月为例):select sum(value),dtime from viewsource group by month(dtime)
    按源IP统计总流量:Select sum(value),src_ip from viewsource group by src_ip 
    按目的Ip统计总流量 Select sum(value),dest_ip from viewsource group by dest_ip 
    按源IP统计某段时间内的流量 Select sum(value),src_ip from viewsource 
                            where  起始时间<dtime <终止时间
                            group by src_ip 按目的Ip统计某段时间的流量 Select sum(value),dest_ip from viewsource 
                                   where  起始时间<dtime <终止时间
                                       group by dest_ip 
    从原Ip到目的ip某段时间的流量:select sum(value),src_ip ,dest_ip  from viewsource 
                               where 起始时间<dtime <终止时间
                                   group by src_ip,dest-ip 
    指定源ip 目的ip 时间段 查询:select sum(value)),src_ip ,dest_ip  from viewsource 
                               where 起始时间<dtime <终止时间 
                                          and src_ip= 源Ip and dest_ip = 目的ip
                                   
    另外还可能要实现 排名功能:按ip 按时间段 排名,取出前5名进行显示在前台页面
    ,表的结构应该怎么优化,例如索引的使用,之类的,语句本身的优化。 
      

  6.   

    参考一下这个贴子
    http://topic.csdn.net/u/20090701/11/2599adb6-32ef-4688-9235-5015461a4a65.html?60678