考勤記錄cardtime表id,userid,logtime 三个字段,大概350萬條記錄,php+mysql 查詢時很慢,如果查其中一個人的每月記錄,差不多要10S左右,建了索引查詢還是很慢,有沒其它辦法提高查詢速度,查詢條件是select * from cardtime where userid="13155" and logtime like '%2009-06%',這樣查時會掃描整個表所以很慢,有沒其它辦法!

解决方案 »

  1.   

    補充:SQL語句在MYSQL裏執行時很快,在PHP代碼裏查詢MYSQL時就很慢!
      

  2.   

    select id,userid,logtime from cardtime where userid="13155" and logtime like '%2009-06%'
    后面的查询条件,也可以改一下,改成具体查询。 用 MONTH,YEAR  或者 ..FORMAT 等转化一下 
      

  3.   

    logtime设置索引
    logtime like '%2009-06%'语句,改成
    date_format(logtime, '%Y-%m') = '2009-06'
    在后面加上limit子句
    select * from cardtime where userid="13155" and date_format(logtime, '%Y-%m') = '2009-06' limit 0, 30
      

  4.   

    like子句最好别用,
    如果用也不要 like '%xxx%'
      

  5.   

    日期可以mysql函数计算成你想要的
      

  6.   

    logtime 是什麼類型
    儘量不要用like語句
      

  7.   

    like查询尽量少用,而like '%sss%'应该不用。
      

  8.   

    logtime like '%2009-06%'这句的问题可能比较大,
    但是在下结论之前,先察看下执行效果后再下定论EXPLAIN  select * from cardtime where userid="13155" and logtime like '%2009-06%'
      

  9.   

    explian一下语句,一般不存在mysql命令行里快,php里慢的问题,php里是否还有其他逻辑导致运行缓慢。
    就拿这条sql来说,主要问题出在like子句,如果logtime字段是char类型,可以考虑给logtime的的前7位创建索引
    使用语句。
    select * from cardtime where userid="13155" and logtime like '2009-06%'如果搜索量频繁,可以考虑建立组合索引(userid,logtime);
    还是先explian下吧。看看索引使用情况
      

  10.   


    EXPLAIN  select * from cardtime where userid="13155" and logtime like '%2009-06%' 這樣查詢並沒有返回查詢結果,只是查詢索引信息!如下:id select_type  table type  possible_keys  key  key_len  ref  rows  Extra  
    1  SIMPLE cardlogtime ref search_userid_logtime search_userid_logtime 102 const 111 Using where 
      

  11.   

    創建索引: userid varchar型;logtime datetime "2009-06-25 08:30:30" 型
    alter table cardlogtime add index search_userid_logtime(userid,logtime)
      

  12.   

    是like的问题,百万级的数据量用like是很慢的.
    10楼的正解
      

  13.   

    为什么要用like 啊,直接select * from cardtime 
    where userid="13155" 
    and logtime between '2009-06-01' and '2009-06-30 23:59:59'然后建立复合索引 (userid ,logtime)