查询优化器的提示(hint)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiao__jia__jia/article/details/102769279

                             查询优化器的提示(hint)


 如果对优化器选择的执行计划不满意,可以使用优化器提供的几个提示(hint)来控制最终的执行计划。

相关提示如下:

HIGH_PRIORITY 和LOW_PRIORITY(当多个语句同时访问 一个表时,语句执行的 优先级)
HIGH_PRIORITY 用于select语句时,会将此语句重新调度到所有正在等待表锁以便修改数据的语句之前。放在insert语句之前时只是简单地抵消全局LOW_PRIORITY设置对该语句的影响。
LOW_PRIORITY会 让语句一直处于等待状态,只要队列中还有需要执行的语句。可以再select、insert、update、delete语句中使用。
这两个提示只对使用表锁的存储引擎有效,千万不要再InnoDB或者其他细粒度的锁机制和 并发控制的 引擎中使用。

DELAYED(将语句执行结果立即返回给客户端)
适合于insert和replace。mysql会先返回客户端结果,再将插入的行数据放入到缓冲区,然后在表空闲时批量 将数据写入磁盘。适合日志系统使用,但是该提示会导致函数LAST_INSERT_ID()无法正常工作。

STRAIGHT_JOIN(与关联表的顺序有关)
当放在select语句的select 关键字之后时,表示让查询中所有的表按照在语句 中出现的顺序关联;
当放在任何两张关联表的名字之间时,表示固定其前后两个表的关联顺序。
使用这个提示可以大大提高优化器的效率。

SQL_SMALL_RESULT 和 SQL_BIG_RESULT(告诉优化器对group by 或者distinct查询如何使用临时表及排序)
只对select 语句有效。SQL_SMALL_RESULT告诉优化器结果集会很小,可以将结果集放在内存中的索引临时表,以避免排序操作。  SQL_BIG_RESULT则告诉优化器结果集可能会非常大,建议使用磁盘临时表做排序操作。

SQL_BUFFER_RESULT(告诉优化器将查询结果放入到一个临时表,释放表锁)
当你没法使用客户端缓存的时候,使用服务端的缓存通常很有效。代价是,服务器端将需要更多的内存。

SQL_CACHE 和SQL_NO_CACHE(告诉mysql是否需要将结果集缓存子查询缓存中)

SQL_CALC_FOUND_ROWS(让mysql返回的结果集包含更多的信息)

FOR UPDATE 和 LOCK IN SHARE MODE(控制select 语句的锁机制,但只对实现了行级锁的存储引擎有效)
对符合查询条件的数据行加锁。唯一内置的支持这两个提示的引擎是InnoDB。这两个提示会让某些优化无法正常使用,例如索引覆盖扫描。InnoDB不能在不访问主键的情况下排他地锁定行,因为行的版本信息保存在主键中。

USE INDEX、IGNORE INDEX 和FORCE INDEX(告诉优化器使用或者不使用哪些索引来查询记录)
在mysql5.1之前,这些提示并不会影响到优化器选择哪个索引进行排序和分组。
在mysql5.1之后,可以通过新增for order by 和 for group by 来指定是否对排序和分组有效。
FORCE I NDEX 和 USE INDEX基本相同,除了一点:FORCE INDEX会告诉优化器全表扫描的成本会远远高于索引扫描,哪怕实际上该索引用处不大。

在mysql5.0之后,新增加一些参数来控制优化器的行为:
optimizer_search_depth:这个参数控制优化器在穷举执行计划时的限度。如果查询长时间处于“statistics”状态,那么可以考虑调低此参数。
optimizer_prun_level:默认打开,根据需要扫描的行数来决定是否跳过某些执行计划。
optimizer_switch:这个变量包含了一些开启/关闭优化器特性的标志位。例如可以通过这个参数控制禁用索引合并的特性。
 

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/102769279
今日推荐