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