MySQL如何强制指定索引
一、介绍
在平常的慢SQL
优化过程中,往往会出现走不到索引的情况。
有时候,确实是因为写的查询条件太差劲导致。
但有时,明明就是有索引,查询条件也写对的,可就偏偏走到了另外一条索引上。
这种情况往往发生在连表的过程中,因为我们连表通常是使用
id
与ref_id
进行关联,偶尔会附带一些其他的条件。
那么,该如何指定索引呢?
二、使用
1)FORCE INDEX
代码语言:javascript复制-- 单表的查询
SELECT * FROM table_name FORCE INDEX (index_name) WHERE condition;
-- 连表的查询
SELECT * FROM table_name t1 FORCE INDEX (index_name)
JOIN table_name_bak t2 FORCE INDEX (index_name_bak) ON t1.id = t2.ref_id
WHERE condition;
在表后添加FORCE INDEX (index_name)
,记得索引名称一定要正确
代表使用了这个固定的索引去查询那张表
2)USE INDEX
代码语言:javascript复制-- 单表的查询
SELECT * FROM table_name USE INDEX (index_name) WHERE condition;
-- 连表的查询
SELECT * FROM table_name t1 USE INDEX (index_name)
JOIN table_name_bak t2 USE INDEX (index_name_bak) ON t1.id = t2.ref_id
WHERE condition;
和上面FORCE INDEX(index_name)
不同的是,这边是允许MySQL
,如果有更好的索引,就选择更好的索引。
三、最后
其实,我并不推荐这种指定索引的方式。
强制索引可能会导致性能问题,一杆子打死,对后面优化器选择最优的索引不利。
在大多数情况下,我们是没有必要强制指定索引