失效指的是,条件中如果有or,只要其中一个条件没有索引,其他字段有索引也不会使用。
查询语句是这样的
SELECT
*
FROM
GLIDE g,
WORKER w,
MANAGER_PATH p,
SITE s
WHERE
g.R_WORKER_ID = w.WORKER_ID
AND w.WORKER_ID = p.WORKER_ID
AND s.ID = g.G_COM_STIE_ID
AND
(g.R_WORKER_ID = '00333866'
OR g.INSERT_WORKER_ID = '00333866'
)
AND g.G_STATUS > - 1
ORDER BY
g.ID DESC;
此时GLIDE 表中的 R_WORKER_ID 是有索引的,INSERT_WORKER_ID 没有索引,explain结果如下,table g中,type 是index,全表扫描,非常慢。
然后给INSERT_WORKER_ID 加了索引
再看,这个时候type 是index_merge,合并索引,extra 中是 using union,相当于先
select * from GLIDE WHERE R_WORKER_ID='00333866'
union
select * from GLIDE WHERE INSERT_WORKER_ID='00333866'
查询速度直接从4s降到了0.4s (测试环境机器不是很好),生产环境的数据是 从1.5s降到了 0.01s