是不是  where  的字段没有索引

解决方案 »

  1.   

    有的,where的三个字段都分别加上了索引
      

  2.   

    贴出 explain select * from t_access_token WHERE state = 0 
    AND account = '账号,每条sql值都不一样' 
    AND token <> '令牌,每条sql值都不一样';的结果以供分析。
      

  3.   

    1.看一下存储引擎是否为myisam。如果是myisam则改为innodb。
       show create table t_access_token;
       如果是myisam则修改为innodb:   alter table t_access_token engine=innodb;
    2.看一下执行计划,并贴出结果。
       explain select * from t_access_token where state=0 and account='xxx' and token <> 'xxx';
      

  4.   


    谢谢回答,表是Innodb引擎
    结果如下id  select_type  table           type         possible_keys                                                        key                                            key_len  ref  rows  Extra                                                                        
    1   SIMPLE       t_access_token  index_merge  idx_accesstoken_token,idx_accesstoken_state,idx_accesstoken_account  idx_accesstoken_state,idx_accesstoken_account  4,66          523   Using intersect(idx_accesstoken_state,idx_accesstoken_account); Using where  
      

  5.   

    索引没有创建。
    create index sss on t_access_token(state,account,token);
      

  6.   

    个人意见:如果索引这样建立,猜测表中state字段=0的数据应该占表中总数据大于10%
                       所以我认为可以create index sss on t_access_token(account,token,state);
    楼主可以随意变换下位置测试下。
    谢谢
      

  7.   

    个人意见:如果索引这样建立,猜测表中state字段=0的数据应该占表中总数据大于10%
                       所以我认为可以create index sss on t_access_token(account,token,state);
    楼主可以随意变换下位置测试下。
    谢谢
    好的,我明天合起来测下
      

  8.   


    应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  
      

  9.   


    有的,where的三个字段都分别加上了索引
    应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  
      

  10.   


    有的,where的三个字段都分别加上了索引
    应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  明白了,但是像我这条需要过滤的语句,如果不用<>,要怎么写
      

  11.   


    有的,where的三个字段都分别加上了索引
    应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  明白了,但是像我这条需要过滤的语句,如果不用<>,要怎么写
    看看把前两者建立一个索引,最后哪个单独建一个索引。这个不敢肯定呀。