请教各位老大,我有个数据表有20多万测试数据,有4个分类,通过分类id来查询数据,但是我发现不在分类id建索引时,有些分类查询快,有些查询慢,比如有个分类有50000条记录,查询时间0.8左右,有个分类数据只有30000多却要2秒多,我就在分类添加索引,可是发现原来慢的现在变快了,原来快的现在却变慢了,用EXPLAIN检查查询语句,发现有的分类使用索引,而有的没使用,还有,发现索引的数量只有在单数时才更新,就是说如果商品表中有4类商品,那么索引数只显示为3,如果我在添加一个分类商品,那么它就正常了,显示为5
查询语句:select 字段列表 from goods where goods_sort in(3) order by goods_id desc

解决方案 »

  1.   

    MySQL是否使用索引是和查询结果的记录数有关的。一般来说,如果查询结果集如果超过整个表行数的某个比例,MySQL就会放弃使用索引,而直接表扫描。
    为什么要这么做呢?是因为当结果集很大时,使用索引反倒会慢。因为MySQL首先搜索索引,而后根据索引再搜索表中记录,相当于先读取索引记录,再根据索引记录读取表记录,而索引记录又没有有效的减少所要搜索的表记录,所以就慢了。不知道我说明白了没有,谢谢
      

  2.   

    不知道楼主的SQL语句是怎么写的。如果你用到了in,就有问题。当使用in时,MySQL不会首先考虑使用in列作为索引列,即使该列有索引,也就是说,如果where中还有其它条件列有索引,则会首选该列作为索引列。如:
    select * from tablename where index_col1 in(……) and index_col2 = 1;
    这时会选择index_col2作为索引列。
    当MySQL没有其它选择时会用到in条件列作为索引列,如:
    select * from tablename where index_col1 in(……) and noindex_col2 = 1;
      

  3.   

    查询语句:select 字段列表 from goods where goods_sort in(3) order by goods_id desc
    我试试
      

  4.   

    试了一下,单独这样查询分类产品也是有的有用索引,有的没有,要查询的数据为总记录数的百分之十到百分之二十左右,goods_sort使用索引
    select goods_name,goods_img from goods where goods_sort in(3)