下面说的都是在where或者where...order by的基础上。
如:
我在一张表建立了联合索引.
ALTER TABLE `A` ADD INDEX `abc` (`a`,`b`,`c`);
由于某种需要,还需要对某个字段建立普通索引
ALTER TABLE `A` ADD INDEX `a` (`a`);
ALTER TABLE `A` ADD INDEX `b` (`b`);用explain 观察
possible_keys 可能会有a,b,abc
key 可能是a、b或abc
Extra 是Using where; Using filesort
虽然type是ref级别。
但是从Extra中的Using filesort看,语句还是多做了一次排序,比较影响性能。象这样的情况,怎么处理?删除某个索引?在实际环境上,如:explain SELECT btitle.id,btitle.hit,btitle.bbstop,btitle.sign,btitle.huati,btitle.P_display,btitle.bbs_img,btitle.title,btitle.redate,btitle.rep,btitle.picture,btitle.name FROM bbstitle btitle WHERE btitle.BoardID_1='A_6' AND btitle.BoardID_2='A_6_4' AND btitle.deleted=0 ORDER BY bbstop desc,SIGN DESC,huati desc,redate desc LIMIT 0,30+----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+-----------------------------+
| 1 | SIMPLE | btitle | ref | deleted,BoardID_2,BoardID_1,bbd | BoardID_2 | 1002 | const | 1001 | Using where; Using filesort | 
+----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+----------

解决方案 »

  1.   

    有order by了当然要多次排序  除非 把order by里面的字段也加到索引中去
      

  2.   

    EXPLAIN中出现了Using filesort,说明排序时没有借助索引,可以对排序字段建立索引。
      

  3.   

    建立了联合索引(a,b,c)将相当于建立了三个索引
    第一个(a)
    第二个(a,b)
    第三个(a,b,c)
    索引建立了(a,b,c)后又建立(a)索引显然重复了
      

  4.   

    一个WHERE ORDER BY 只会用到一个索引。
      

  5.   

    可能我没有描述清楚。
    在组合索引中,应该考虑了order by的字段。
    如:
    ... where a=? order by b desc,c desc limit 0,10
      

  6.   

    在没有增加普通索引的时候,是有借助组合索引。
    但是加了普通索引之后,在key,变成了b或c,而不是abc
      

  7.   

    从key来看,是用到b或c,而不是用到abc。
      

  8.   

    对于多表联接查询,如果不想文件排序,ORDER BY子句中只能出现联接的第一个表(哪个是第一个表取决于优化器的选择,当然也可以用STRAIT JOIN来强制连接顺序,不过最好把选择权交给优化器)中的字段,且所有排序字段属于同一个索引(最左前缀索引);否则filesort是不能避免的~
    LZ需要权衡利弊,如果对排序使用了索引,就可能要舍弃WHERE子句可用的索引~
      

  9.   

    建议楼主贴出你实际的情况以供分析,否则一会A,B,C,一会又是其它字段。贴出你的show index 
      

  10.   

    explain SELECT btitle.id,btitle.hit,btitle.bbstop,btitle.sign,btitle.huati,btitle.P_display,btitle.bbs_img,btitle.title,btitle.redate,btitle.rep,btitle.picture,btitle.name FROM bbstitle btitle WHERE btitle.BoardID_1='A_6' AND btitle.BoardID_2='A_6_4' AND btitle.deleted=0 ORDER BY bbstop desc,SIGN DESC,huati desc,redate desc LIMIT 0,30+----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+-----------------------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+-----------------------------+
    | 1 | SIMPLE | btitle | ref | deleted,BoardID_2,BoardID_1,bbd | BoardID_2 | 1002 | const | 1001 | Using where; Using filesort | 
    +----+-------------+--------+------+-----------------------------+-----------+---------+-------+------+------show index from bbstitle
    索引有
    1、deleted
    2、BoardID_1
    3、BoardID_2
    4、bbd