日期:2014-05-16  浏览次数:21043 次

mysql里where条件中包含or应该怎么建立有效的索引。
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在查询条件里面不能使用索引?

------解决方案--------------------
看一下手册上的索引合并优化部分就明白了。
如果同时有OR和 AND的话。优化器只考虑AND部分的优化。
所以你要对displayorder建立索引。
------解决方案--------------------
你可以这样强制使用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