SELECT b.* FROM b WHERE b.DEAL_FLAG=1 ORDER BY b.SEND_ALL_ID desc limit 0,10;
SELECT b.* FROM b WHERE b.DEAL_FLAG!=1 ORDER BY b.SEND_ALL_ID desc limit 0,10;
b表数据2百万,SEND_ALL_ID是主键, deal_flag字段绝大多数值是1,很小一部分是其他值(如0,-1,-2),问题在于如何加索引使上面两个sql查询速度都很快?

解决方案 »

  1.   

    create index xxxx on b (SEND_ALL_ID)
      

  2.   

    这样做两个sql查询都要3秒以上才行
      

  3.   

    加联合索引  alter table b add index(DEAL_FLAG,SEND_ALL_ID)第一个查询用主键扫描即可
    第二个查询要用新加的索引会比较快
      

  4.   

    这样两个查询是都比较快,但是第一个查询并没有用主键扫描,explain看到还是用的联合索引,
    且这样做SELECT count(*) FROM b WHERE b.DEAL_FLAG=1 需要3秒以上 
      

  5.   

    create index idx_name on b(send_all_id)
    deal_flag重复率比较高标示列不用创建索引的。
      

  6.   

    create index xxxx on b (SEND_ALL_ID);
    select b.* from b ,( select SEND_ALL_ID from FROM b WHERE b.DEAL_FLAG=1 ORDER BY b.SEND_ALL_ID desc limit 0,10) a
    where b.SEND_ALL_ID=a.SEND_ALL_ID;
      

  7.   

    create index idx_name on b (SEND_ALL_ID);