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优化器用到了一个低效的索引。

 

posted @ 2019-08-01 11:35  code口德  阅读(6290)  评论(0编辑  收藏  举报