索引提示为优化器提供关于在查询处理期间如何选择索引的信息。中描述的索引提示与优化器提示不同第8.9.3节,“优化器提示”.索引和优化器提示可以单独使用,也可以一起使用。
索引提示在表名后面指定。中指定表的一般语法选择
声明中,看到第13.2.10.2节“联接条款”)。引用单个表的语法,包括索引提示,如下所示:
tbl_name[[是]别名] [index_hint_list]index_hint_list:index_hint[index_hint)……index_hint:使用{index | key}[用于{join | order by | group by}] ([index_list| {ignore | force} {index | key} [for {join | order by | group by}] (index_list)index_list:index_name(,index_name)……
的使用索引(
hint告诉MySQL只使用一个命名索引来查找表中的行。另一种语法index_list
)忽略指数(
告诉MySQL不要使用某些特定的索引。这些提示是有用的,如果index_list
)解释
显示MySQL正在使用可能索引列表中的错误索引。
的力指数
提示就像使用索引(
,并假定表扫描是非常贵了。换句话说,只有在无法使用一个命名索引来查找表中的行时,才使用表扫描。index_list
)
从MySQL 8.0.20开始,服务器支持索引级优化器提示JOIN_INDEX
,GROUP_INDEX
,ORDER_INDEX
,指数
,它们相当于并有意取代力指数
索引提示,以及NO_JOIN_INDEX
,NO_GROUP_INDEX
,NO_ORDER_INDEX
,NO_INDEX
优化器提示,它等价于并旨在取代忽略指数
索引提示。因此,您应该预料到使用索引
,力指数
,忽略指数
在MySQL的未来版本中被弃用,并在以后的某个时候被完全删除。有关更多信息,请参见索引级别的优化器提示.
每个提示都需要索引名,而不是列名。要引用主键,请使用名称主要的
.要查看表的索引名,请使用显示指数
声明或INFORMATION_SCHEMA。统计数据
表格
一个index_name
值不必是完整的索引名。它可以是索引名的明确前缀。如果前缀是模糊的,则会发生错误。
例子:
SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3WHERE col1=1 AND col2=2 AND col3=3
索引提示的语法有以下特点:
省略在语法上是有效的
index_list
为使用索引
,这意味着”不使用索引。”省略index_list
为力指数
或忽略指数
是语法错误。属性可以指定索引提示的范围
为
从句的提示。这为查询处理的各个阶段的执行计划的优化器选择提供了更细粒度的控制。若要仅影响MySQL决定如何在表中查找行以及如何处理连接时使用的索引,请使用为加入
.若要影响对行排序或分组的索引使用,请使用订单的
或为集团
.你可以指定多个索引提示:
SELECT * FROM t1 USE INDEX (i1) IGNORE ORDER BY (i2)
在多个提示中命名相同的索引(即使在同一个提示中)也不会出错:
SELECT * FROM t1 USE INDEX (i1);
然而,这是一个错误的混合
使用索引
而且力指数
对于同一个表:SELECT * FROM t1 USE INDEX FOR JOIN (i1);
如果索引提示包含no为
从句中,提示的范围适用于语句的所有部分。例如,以下提示:
忽略指数(i1)
相当于以下提示的组合:
忽略INDEX FOR JOIN (i1),忽略INDEX FOR ORDER (i1)
在MySQL 5.0中,提示作用域没有为
子句只适用于行检索。时,导致服务器使用此旧行为为
子句存在时,启用老
服务器启动时的系统变量。请注意在复制设置中启用此变量。对于基于语句的二进制日志记录,对于源和副本使用不同的模式可能会导致复制错误。
当处理索引提示时,它们按类型(使用
,力
,忽略
)和按范围(为加入
,订单的
,为集团
).例如:
SELECT * FROM t1 USE INDEX () IGNORE INDEX (i2) USE INDEX (i1);
等价于:
SELECT * FROM t1 USE INDEX (i1,i2) IGNORE INDEX (i2);
然后索引提示按以下顺序应用于每个作用域:
{使用武力|}指数
如果存在则应用。(如果不是,则使用优化器确定的索引集。)忽略指数
应用于上一步的结果。例如,以下两个查询是等价的:SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2);SELECT * FROM t1 USE INDEX (i1);
为全文
搜索、索引提示的工作原理如下:
对于自然语言模式搜索,索引提示会被忽略。例如,
忽略指数(i1)
在没有警告的情况下被忽略,索引仍然被使用。对于布尔模式搜索,索引提示使用
订单的
或为集团
是默默地忽略。索引提示和为加入
或没有为
修饰符是荣幸。与之相反,提示如何应用于非全文
搜索时,该提示用于查询执行的所有阶段(查找行和检索、分组和排序)。即使给出了非-的提示,这也是正确的全文
索引。例如,以下两个查询是等价的:
SELECT * FROM t USE INDEX (index1) IGNORE INDEX (index1) FOR ORDER BY忽略INDEX (index1) FOR GROUP BY WHERE…在布尔模式下…;SELECT * FROM using INDEX (index1) WHERE…在布尔模式下…;