为什么不把codeall独立作为一个表:jobid     code用find_in_set这种函数实在是太……了……

解决方案 »

  1.   

    1 datetime建索引
    2 建议建job和majortype的关联表 job_mt
      jobid  code
    3 或者 job表的codeall 里存放majortype表中的id拼成的字符串,而不是code组成的字符串,因为find_in_set对数字字符串有内置优化sql语句本身好像没啥优化的
      

  2.   

    1.建立codeall和datetime的复合索引
    2.DATE_SUB(NOW(),INTERVAL 3 MONTH) < datetime,把datetime放到左边
    修改之后explain select对比一下搜索结果
      

  3.   

     datetime 放左边 右边 explain各项值没有变化,不过建立这个复合索引后,rows变少了很多
      

  4.   

    mysql判断时间的select、排列,弄不好就要对所有数据进行查询,
    我给你出的方子就是要缩减搜索对象。
    rows少,说明被搜索的对象少了,速度自然提高。
      

  5.   

    1.建立codeall和datetime的复合索引  
    的确select搜索的行数减少了很多
      

  6.   

    谢谢froole兄 和楼上所有人的回答
     索引是有健, 但是这样的复合索引没有建
     我想还没有进一步的优化, 或者其他的建议呢?
      

  7.   


    依照lz给的表结构,优化应该就到此为止了,
    再优化恐怕就要改结构了。majorytype和job关系的表单分出一个来。
      

  8.   

      SELECT name,datetime,get_name(codeall) FROM job WHERE 
      DATE_SUB(NOW(),INTERVAL 3 MONTH) < datetime ORDER BY datetime DESC实现自定义函数get_name(codeall),根据code翻译出 name
      

  9.   

    使用MySQL的命令FIND_IN_SET等还是很高效的,至少比php高效
      

  10.   

    增加一个表格做INDEX是最好的方法
    现在不做只会以后痛苦