SELECT t.* FROM cdb_threads t WHERE (t.fid='2' Or t.otherfid='2') AND t.displayorder>=0 ORDER BY t.displayorder DESC, t.lastpost DESC LIMIT 0, 20
这条SQL语句应该如何优化建立索引呢,
ALTER TABLE `cdb_threads` ADD INDEX `otherfid` ( `fid` , `otherfid` , `displayorder` , `lastpost` )
我建立上面的索引后使用EXPLAIN分析了一下
EXPLAIN SELECT t.* FROM cdb_threads t WHERE (t.fid='2' Or t.otherfid='2') AND t.displayorder>=0 ORDER BY t.displayorder DESC, t.lastpost DESC LIMIT 0, 20 
发现没有使用索引哦,是不是有OR在查询条件里面不能使用索引?

解决方案 »

  1.   

    看一下手册上的索引合并优化部分就明白了。
    如果同时有OR和 AND的话。优化器只考虑AND部分的优化。
    所以你要对displayorder建立索引。
      

  2.   

    你可以这样强制使用OR条件中的字段作为索引。SELECT t.* FROM cdb_threads t FORCE INDEX(t.fid,t.otherfid) WHERE (t.fid='2' Or t.otherfid='2') AND t.displayorder>=0 ORDER BY t.displayorder DESC, t.lastpost DESC LIMIT 0, 20
      

  3.   

    不好意思,忘记说一句自己的MYSQL版本是4.0.X的,可能有些功能不支持。