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 ;
推荐使用这种方式!!
作者:small-water
出处:https://www.cnblogs.com/small-water/p/17870103.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通