MYSQL 分很多版本,建议多看看说明.帮你顶!!!

解决方案 »

  1.   

    只要是GROUP BY 用的字段都做索引我试过730万条数据做GROUP BY 统计, 如不用索引, 大概10小时, 用索引 1分钟
      

  2.   

    回 seakingx,是每一字段建立一索引还是多字段建立成一个复合索引呢?
    临时表我建立过了,读入4万记录进临时表也很慢阿。CPU资源100,如何降低它的占用率?回bierhoff,存储过程没有试过,我会试试看得
      

  3.   

    机器配置挺好的,4万条应该很快的,即使不建索引。让大家看看你的SQL大致怎么写的,看看能否改进,再建立合适的索引,应该可以解决的。
      

  4.   

    员工基本信息表中 科室代码 作一个索引
    考勤明细表中 员工代号 迟到 分别作一个索引先处理考勤明细表,生成临时表, 然后在把这个临时表和其他表对应
    建议你把mysql的配置文件[如:my.ini]配置为medium模式,在适当修改一下相应的缓存,问题应该不大的
    一定要用索引,有无索引好多时候是几十倍的差异
      

  5.   

    SELECT 员工.员工代号, 员工.姓名, 员工.年龄, 科室.科室名称, SUM(考勤.迟到) AS 迟到次数, SUM(考勤.迟到 XOR 1) AS 准时次数 
    FROM 员工信息 员工
    LEFT JOIN 考勤明细 考勤 ON 员工.员工代号=考勤.员工代号
    LEFT JOIN 科室明细 科室 ON 员工.科室代码=科室.科室代码
    WHERE 员工.姓名 RLIKE('EDIT->TEXT')EDIT->TEXT为空时,可以返回所有员工的统计资料
    为了方便大家看,所以用了中文做字段和表名.
      

  6.   

    回 loveflea,把mysql的配置文件[如:my.ini]配置为medium模式是不是CPU资源就不会占用那么多?!
      

  7.   

    一个用户ID对应的姓名,年龄和科室都是唯一的,那么没必要在一个SQL里把姓名,年龄和科室也做为分组的一项,而且这样需要几个表关联,要做巨大的运算,而绝大部分的运算都是无谓的,必然影响效率,可以先单对考勤表以用户ID作为分组条件统计:
    SELECT 员工代号, SUM(考勤.迟到) AS 迟到次数, SUM(考勤.迟到 XOR 1) AS 准时次数 
    FROM 考勤;这样的统计基本立刻就完了,再把统计结果放入一个临时表,然后临时表和另两个表之间关联以得到你想要的结果。没了统计,后者也是很快的,这样看能不能达到你的目的。
      

  8.   

    A:先谈效率问题.正如 seakingx(抗日统一联盟:亚龙湾) 所述 MySQL 如果在 Group By 时不能使用合理的索引.
    那速度将是慢得惊人的.建议修改以下启动参数key_buffer_size
    max_heap_table_size
    sort_buffer
    record_buffer
    join_buffer_size
    myisam_sort_buffer_size
    net_buffer_length 
    tmp_table_size
    B:
    本楼主问题的建议考勤明细表 建议表结构序号 int 主键自动增加,
    员工代号 int 索引,
    打卡时间 datetime,
    状态 tinyint(上班或是下班)然后新建一个月统计表.
    每个月对 考勤明细表 进行一次统计后.加入到月统计表中
      

  9.   

    看了大家的回复,我很感动。我现在一一照大家的方法来试验,到时我把结果告诉大家。谢谢大家关心,帮助我!感谢CSDN给我们提供了那么好的讨论氛围!
      

  10.   

    用left join 这样会快很多