MySQL数据库支持索引提示(INDEX HINT)显式的高速优化器使用了哪个索引。以下是可能需要用到INDEX HINT的情况
a)MySQL数据库的优化器错误的选择了某个索引,导致SQL运行很慢。这个在最新版的数据库版本中非常少见。优化器在绝大部分情况下工作的非常有效和正确。
b)某些SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会大于SQL语句本身例如优化器分析Range查询本身就是比较耗时的操作。这时DBA或开发人员分析最优的索引选择,通过index hint来强制使优化器不进行各个路径的成本分析直接选择指定的索引来完成查询
MySQL数据库的Index Hint语法
看个表结构
CREATE TABLE t( a INT, b INT, KEY(a), KEY(b) )ENGINE=INNODB; INSERT INTO t SELECT 1,1; INSERT INTO t SELECT 1,2; INSERT INTO t SELECT 2,3; INSERT INTO t SELECT 2,4; INSERT INTO t SELECT 1,2;
查看执行计划
如图SQL语句可以使用a,b索引,实际使用的索引为b,a完成整个查询,列Extra提示Using intersect(b,a)表示根据两个索引得到的结果进行求交的数学运算,最后得到结果
如果我们使用USE INDEX 的索引来使用a这个索引呢
EXPLAIN SELECT * FROM t USE INDEX(a) WHERE a=1 AND b=2;
可以发现,优化器使用了a的索引,但use index只是告诉优化器可以选择该索引,实际上优化器还是会根据自己的判断进行选择,最可靠的做法是FORCE INDEX