9.索引提示(INDEX HINT)

MySql支持索引提示(INDEX HINT)显式地告诉优化器使用那个索引。

一般来说,下面两种情况需要用到索引提示:
1)MySql错误的使用了某个索引从而导致SQL语句运行的非常慢。(这种情况非常少见,如果遇见了,就去买彩票吧)
2)某些SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会大于SQL语句本身。 这时使用索引提示是有必要的。
例如,优化器分析Range查询本身就是比较耗时的操作,
这时DBA或开发人员分析最优的索引选择,通过INDEX HINT来强制让优化器直接选择指定的索引进行查询,而不去分析选择使用那个索引。

使用索引提示的sql语句有两种:

SELECT * FROM t USE INDEX(a) WHERE a=1 AND b = 2;

这个语句只是提醒优化器使用那个索引,具体的选择还是优化器说了算,不推荐使用。

SELECT * FROM t FORCE INDEX(a) WHERE a=1 AND b = 2;

这条语句强制优化器直接使用指定的索引进行查询,推荐使用。

例子:
首先,创建一张表

CREATE TABLE t(
    a INT,
    b INT,
    key(a),
    key(b)
)

然后向其中插入数据:

INSERT INTO t(a,b)values(1,1);
INSERT INTO t(a,b)values(1,2);
INSERT INTO t(a,b)values(2,3);
INSERT INTO t(a,b)values(2,4);
INSERT INTO t(a,b)values(1,2);
INSERT INTO t(a,b)values(1,4);

然后查看下面语句的执行计划:

select * from t where a=1 and b=2 ;

在这里插入图片描述

通过key值我们可以看到,此次查询使用了两个索引b,a。
Extra列提示的Using intersect(b,a)表示根据两个索引得到的结果进行求交的数学运算,最后得到结果。

下面使用USE INDEX来提示优化器进行查询:

select * from t use index(a) where a=1 and b=2 ;

在这里插入图片描述

可以看到也起到了作用。

下面使用FORCE INDEX进行强制使用某索引:

select * from t force index(a) where a=1 and b=2 ;

在这里插入图片描述

推荐使用这种方式!!

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/120872688