force index强制使用指定索引
问题:对于一个8000w数据量并有索引的表进行查询,查询了5分钟才查询出结果
产生问题的原因:索引失效。 数据表中数据量非常大,而查询条件只有时间区间。(因为是>= 和 <= 无法使用索引)
SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六
FROM 表一 INNER JOIN 表二 ON 关联条件 INNER JOIN 表三 ON 关联条件 INNER JOIN 表四 ON 关联条件
WHERE 表一.created
>= '2019-07-09 00:00:00' AND 表一.created
<= '2019-07-30 23:59:59' ORDER BY 表一.created
DESC
执行explain,发现该查询检索了全表8000w的数据。
如上图索引失效,并未使用created字段作为查询索引,而是一个联合索引对查询优化并无作用。 造成索引失效的原因有哪些,请看这表文章()
force index(表一_字段)
SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六 FROM 表一 force index(表一_字段) INNER JOIN 表二 ON 关联条件 INNER JOIN 表三 ON 关联条件 INNER JOIN 表四 ON 关联条件
WHERE 查询条件一 AND 查询条件二(表一.created
>= '2019-07-09 00:00:00' AND 表一.created
<= '2019-07-30 23:59:59') ORDER BY 表一.created
DESC
添加了强制索引后再执行explain,这次只检索了满足查询条件的110w条数据。
如图,这次就使了created字段作为索引。查询的数据量明显减少,并且使用了created字段作为索引。
注意:mysql优化器会计算出一个合适的索引,但是这个索引不一定是最好的。force index()指令可以避免MySql优化器用到了一个低效的索引。