情况是这样,有一个表格如下:
TABLE: product
id -- BigDecimal
updated_time -- TimeStamp
product_code -- Varchar(255)
producer -- BigDecimal
......
.....这个表里有一个UNIQUE_KEY (product_code, producer)查询的时候需要按updated_time和producer查询,虽然里面有几个LEFT JOIN,但应该不是主要问题,就略过了。SQL大概如下:SELECT * FROM produce 
WHERE DATE(updated_time) >= '2011-06-01' 
AND DATE(updated_time) <= '2011-06-28' 
AND producer = 2这个表里有200万条记录,并且以每天30万左右增长。按照上面的查询原则SELECT的时候,速度很慢,于是我看了一下EXPLAIN,发现product这个表里被查询的记录在200万条以上,也就是说每条记录都被查看了一遍,于是我就增加了一个索引date_producer_index -- (updated_time, producer)索引建立之后,表格里的所有记录被分割成了200万条(因为日期精确到秒,所以几乎没有重复的updated_time)再次查询,EXPLAIN,发现这个索引被使用了,但还是遍历了200万条记录。我不太明白这个索引是否建立正确,为什么没有用,请各位帮忙,看看应该怎么解决这个问题。谢谢!

解决方案 »

  1.   

    有没用到order by等排序的?    orical查询的时候用order by会非常影响效率,具体的我忘记了,以前碰到过这类问题,是性能测试给我提出的
      

  2.   

    WHERE DATE(updated_time) >= '2011-06-01'  
    AND DATE(updated_time) <= '2011-06-28'  MYSQL不怎么用,上面这语句改成between会好一些。
    另外updated_time字段本来就是时间了,需要DATE(updated_time)这样写吗?会不会先把updated_time全部转成DATA然后再查询的呢?
      

  3.   


    没有order by,只是简单查询就遍历200万条
      

  4.   


    转换成DATE(timestamp)主要目的是消除时间,因为timestamp是类似2011-06-01 22:38:29这样的东西,如果和一个2011-06-01比对的话,那2011-06-01 不大于等于 2011-06-01 22:38:29,这样查询的结果就不对。我觉得between和 date1 >= timestamp >= date2 效果是一样的,这个应该不是影响速度的因素吧。主要还是索引没起作用,遍历所有记录导致速度下降