当前位置: 首页 > article >正文

MySQL开发04-MySQL优化器的提示功能

文章目录

  • 1、提示功能概述
  • 2、提示功能使用
    • 2.1、使用索引(USE INDEX)
    • 2.2、不使用索引(IGNORE INDEX)
    • 2.3、强制使用索引(FORCE INDEX)
    • 2.4、不使用查询缓存(SQL_NO_CACHE)
    • 2.5、使用查询缓存(SQL_CACHE)
    • 2.6、STRAIGHT_JOIN(按字面顺序连接)
  • 3、总结

1、提示功能概述

有时候优化器没有按照我们预想的进行SQL优化,比如我们明明建了索引,但是优化器就是没有使用索引。这时我们可以通过加提示(hint)的方告诉优化器,让它按我们的意图生成执行计划。但是加提示(hint)的方式不到万不得已不要使用。

2、提示功能使用

比较常用的加提示的方式有如下几种。

2.1、使用索引(USE INDEX)

使用索引(USE INDEX):USE INDEX(index_l i st)将告诉MySQL使用我们指定的索引去检索记录。index_list是索引名列表,以逗号分隔。注意,这里设置的是索引名或索引名列表,而不是索引基于的字段名,主键名为PRIMARY。可以使用SHOW INDEX FROM table_name命令显示表上的索引名。

SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;

2.2、不使用索引(IGNORE INDEX)

不使用索引(IGNORE INDEX):IGNORE INDEX(index_list)将建议MySQL不使用指定的索引。如果我们用EXPLAIN命令查看执行计划,发现走了错误的索引,那么可以使用IGNORE INDEX来避免继续使用错误的索引。

SELECT * FROM table1 IGNORE INDEX (col3_index) WHERE col1=1 AND col2=2 AND col3=3;

2.3、强制使用索引(FORCE INDEX)

强制使用索引(FORCE INDEX):有时我们使用USE INDEX指定了索引,但MySQL优化器仍然选择不使用我们指定的索引,这时可以考虑使用FORCE INDEX提示。注意,USE INDEX、IGNORE INDEX和FORCE INDEX这些提示方式只会影响MySQL在表中检索记录或连接要使用的索引,它们并不会影响ORDER BY或GROUP BY子句对于索引的选择。

SELECT * FROM table1 FORCE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3;

2.4、不使用查询缓存(SQL_NO_CACHE)

不使用查询缓冲(SQL_NO_CACHE):SQL_NO_CACHE提示MySQL对指定的查询关闭查询缓冲机制。有时为了验证一条SQL语句实际执行的时间,我们可以临时加上SQL_NO_CACHE,以免被查询缓冲给误导了。对于一些不期望被缓存的SQL,比如夜间的报表查询,可以通过设置SQL_NO_CACHE来让MySQL查询缓冲更高效地工作。

2.5、使用查询缓存(SQL_CACHE)

使用查询缓冲(SQL_CACHE):有时我们将查询缓冲设置为显式模式(explicit mode,query_cache_type=2),也就是说,除非指明了SQL需要缓存,否则MySQL是不考虑缓存它的,我们使用SQL_CACHE来指定哪些查询需要被缓存。

2.6、STRAIGHT_JOIN(按字面顺序连接)

STRAIGHT_JOIN:这个提示将告诉MySQL按照FROM子句描述的表的顺序进行连接。如果用EXPLAIN命令进行检查,确认了MySQL没有按照最优的顺序进行表的连接,那就可以使用这个提示,告诉MySQL按照我们指定的顺序进行连接。不建议自己指定连接顺序,可以尝试重写SQL,看看MySQL是否能够选择更好的执行计划,也可以尝试分析表(运行ANALYZE TABLE命令)以更新索引统计信息,STRAIGHT_JOIN应该是最万不得已时才做的选择。

3、总结

  1. MySQL对于执行计划没有按照预想的方式进行优化时,可以通过加提示的方式对执行计划进行干预,主要包括对索引的强制使用或忽略、对缓存的使用或忽略、对连接顺序的强制指定。
  2. 建议不要在生产环境使用提示功能。

http://www.kler.cn/news/9768.html

相关文章:

  • 小黑子—Java从入门到入土过程:第六章
  • 【openAI】调用gpt-xxx模型时显示网络连接错误(Error communicating with openAI...)
  • 封仲淹:OceanBase开源技术生态全景解析
  • Java基础教程之Object类是怎么回事?
  • 采用多种方式实现项目的查询多级缓存(四)
  • Java模拟rank() over()函数获取分组排名的方法设计及实现
  • 书 | 图理论 | 2020年GraphSage提出者William L. Hamilton《图表示学习》
  • Systemverilog中Constrained random value generation的记录
  • linux之pthread_join函数
  • 安全防御 --- APT、密码学
  • 《数据库系统概论》第三章课后习题 (4个表+三建工程项目)
  • JAVA所有版本特性【JAVA 1.0 - JAVA 20】
  • 圣戈班Saint-Gobain EDI需求分析
  • 计算机网络 - TCP的效率与特性
  • 从0到1基于ChatGLM-6B使用LaRA进行参数高效微调 审核中
  • 49.现有移动端开源框架及其特点—MACE( Mobile AI Compute Engine)
  • 3、ThingsBoard使用jar包单机部署
  • cadence allegro学习记录(四)
  • Golang每日一练(leetDay0030)
  • CDH 之 Kerberos 安全认证和 Sentry 权限控制管理(一)
  • 指令系统和寻址方式
  • 【C语言】switch语句的理解
  • 【RocketMQ】消息的拉取
  • 发布jar到maven中央仓库
  • 简单实用的IntelliJ IDEA集成配置Maven教程:高效构建Java项目
  • MAC 删除自带 ABC 输入法的方法
  • maya arnold自定义aov分层灯光组添加方法
  • 算法笔记-换根DP
  • OKR系统改变您的团队
  • 【职场篇】程序员是否吃青春饭?程序员在35岁之后是否需要转行?