mysql查询优化之三:查询优化器提示(hint)
目录:
《MySQL中的两种临时表》--强制使用临时表 SQL_BUFFER_RESULT
《MySQL 多表关联更新及删除》
《mysql查询优化之三:查询优化器提示(hint)》
《MySQL锁之三:MySQL的共享锁与排它锁编码演示》 --for update 和 lock in share mode
《mysql实战优化之九:MySQL查询缓存总结》--关闭查询缓冲 SQL_NO_CACHE / 强制查询缓冲 SQL_CACHE
上文我们有提及到优化器的一些相关信息,如优化器的一些优化特性和限制,由此看出mysql优化器也并不是万能的。
所以mysql提供了另一种神奇的功能让我们去引导优化器进行更好的优化。
它就是 查询优化提示(Query Optimizer Hints);
查询优化提示会提示优化器按照一定的方式去优化,让你的sql语句更具灵活性,这会让你的查询更快,当然也可能更慢,这完全取决于你对优化器的理解和场景的了解。
现在让我们来了解有哪些查询优化提示:
优先操作 HIGH_PRIORITY
HIGH_PRIORITY可以使用在select和insert操作中,让MYSQL知道,这个操作优先进行。
SELECT HIGH_PRIORITY * FROM TABLE1;
滞后操作 LOW_PRIORITY
LOW_PRIORITY可以使用在select,delete,insert和update操作中,让mysql知道,这个操作滞后。
update LOW_PRIORITY table1 set field1= where field1= …
这两个提示都只在基于表锁的存储引擎非常有效。在innoDB和其他基于行锁的存储引擎,你可能永远用不上。在MyISAM中使用它们时,也要十分小心,因为它们会让并发插入失效,可能会严重下降性能。
延时插入 DELAYED
这个操作只能用于 insert 和 replace
INSERT DELAYED INTO table1 set field1= …
INSERT DELAYED INTO,是客户端提交数据给MySQL,MySQL返回OK状态给客户端。而这是并不是已经将数据插入表,而是存储在内存里面等待排队。
当mysql有 空余时,再插入。另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。
坏处是,不能返回自动递增 的ID,以及系统崩溃时,MySQL还没有来得及插入数据的话,这些数据将会丢失。并且导致last_insert_id()无法正常工作。
强制连接顺序straight_join
SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE...;
由上面的SQL语句可知,通过STRAIGHT_JOIN强迫MySQL按TABLE1、TABLE2的顺序连接表。如果你认为按自己的顺序比MySQL推荐的顺序进行连接的效率高的话,就可以通过STRAIGHT_JOIN来确定连接顺序。
分组使用临时表 SQL_BIG_RESULT和SQL_SMALL_RESULT
SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;
这两个提示只对select语句有效,它们告诉优化器对 group by 或者 distinct 查询如何使用临时表及排序。
sql_small_result 告诉优化器结果集会很小,可以将结果集放在内存中的索引临时表,以避免排序操作;
sql_big_result 则告诉优化器结果集会很大,建议使用磁盘临时表做排序操作;
强制使用临时表sql_buffer_result
SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …;
这个提示告诉优化器将查询放入到一个临时表,然后尽可能地释放锁。这和前面提到的由客户端缓存结果不同。当你设法使用客户端缓存的时候,使用服务器端的缓存通常很有效。
带来的好处是无须在客户端消耗太多的内存,还可以尽可能快的释放对应的表锁。代价是,服务器端需要更多的内存。
查询缓冲
sql_cache 和 sql_no_cache
这个提示告诉mysql是否讲结果集缓存在查询缓存中。
关闭查询缓冲 SQL_NO_CACHE
SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;
有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。
强制查询缓冲 SQL_CACHE
如果在my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。
sql_calc_found_rows
严格来说,这并不是一个优化器提示。它不会告诉优化器任何关于执行计划的东西。
它会让mysql返回的结果集包含更多的信息。查询中加上该提示,mysql会计算出去limit子句后这个查询返回的结果集的总数。
而实际上只返回limit要求的结果集。可以通过函数found_row()获得这个值。
锁相关 for update 和 lock in share mode
这两个提示主要控制select 语句的锁机制。但只对实现了行级锁的存储引擎有效。使用该提示会对符合查询条件的数据加锁。
对于insert...select 语句不需要这两个提示,因为会默认添加上锁。
唯一内置的支持这两个提示的引擎是innoDB。另外需要记住的是,这两个提示会让某些优化无法进行。例如索引覆盖扫描。
innoDB不能在不访问主键的情况下用排他锁锁定行,因为行的信息锁定在主键中。
详细见《MySQL锁之三:MySQL的共享锁与排它锁编码演示》
索引相关
use index, ignore index 和 force index:这几个提示用来告诉优化器是否使用索引来查询记录。
force index 和 use index 基本相同,除了一点:force index 会告诉优化器全表扫描的成本会远远高于索引扫描,哪怕实际该索引用处不大。
强制索引 FORCE INDEX
SELECT * FROM TABLE1 FORCE INDEX (FIELD1);
以上的SQL语句只使用建立在FIELD1上的索引,而不使用其它字段上的索引。
忽略索引 IGNORE INDEX
SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2);
在上面的SQL语句中,TABLE1表中FIELD1和FIELD2上的索引不被使用。
新增参数控制优化器的行为:
optimizer_search_depth
是否跳过执行计划optimizer_prune_level
该参数默认打开的,这让优化器会根据需要扫描的行数来决定是否跳过某些执行计划。
optimizer_switch
这个变量包含了一些开启/关闭优化器特性的标志位。例如mysql5.1 可以通过控制这个参数来控制禁用索引合并的特性。
转载于:https://www.cnblogs.com/duanxz/p/7458450.html
mysql查询优化之三:查询优化器提示(hint)相关推荐
- 【MySQL】MySQL 查询优化器的提示(hint)
1.概述 如果对优化器选择的执行计划不满意,可以使用优化器提供的几个提示(hint) 来控制最终的执行计划.下面将列举–些常见的提示,并简单地给出什么时候使用该提示.通过在查询中加入相应的提示,就可以 ...
- MySQL 5.7-8.9.3 Optimizer Hints(优化器提示)
One means of control over optimizer strategies is to set the optimizer_switch system variable (see S ...
- mysql自带查询优化_MySQL之select in 子查询优化的实现
下面的演示基于MySQL5.7.27版本 一.关于MySQL子查询的优化策略介绍: 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略. 1. 对于 IN.=ANY 子查询,优化器有如下策略 ...
- mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化
本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...
- 【转】MySQL索引和查询优化
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少 ...
- MySQL高级之查询优化(索引失效)
MySQL高级之查询优化(索引失效) 文章目录 MySQL高级之查询优化(索引失效) 一.单表使用索引及常见的索引失效 1.索引失效的案例 2.建议 二.关联查询优化 1.建表 2.案例 3.优化 三 ...
- MySQL索引与查询优化
目录 About MySQL Why MySQL MySQL Index Why Index 索引是如何工作的 如何使用 创建索引 查看索引 删除索引 索引的使用原则 写操作比较频繁的列慎重加索引 索 ...
- 记录一次mysql单表查询优化
mysql单表查询语句如何优化可以加快速度? 优化 MySQL 单表查询语句的方法有很多,以下是一些常用的优化技巧: 索引优化:创建索引可以加快查询速度.索引可以基于一个或多个列创建,可以大大提高查询 ...
- 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇
简介: 本篇介绍子查询.分析表和JOIN的复杂转换过程 一 背景和架构 在<庖丁解牛-图解MySQL 8.0优化器查询解析篇>一文中我们重点介绍了MySQL最新版本8.0.25关于SQL ...
最新文章
- Java项目:实现个人博客系统(java+springboot+mybatis+redis+vue+elementui+Mysql)
- 实战 | 某小公司项目环境部署演变之路
- NSThread创建线程的三种方法
- Struts2 学习系列 (2) 访问web资源
- dynamo python修改多个参数_40岁小白学了30天python发现,编程真的其乐无穷
- getprofile()获取不到路径_获取链接文件Document——Dynamo Python系列教程(一)
- 易宝典——玩转O365中的EXO服务 之四十二 导出就地电子数据展示搜索结果
- java excel 列,使用Java读取Excel工作表的单列
- Thinking in Java 10.2 链接到外部类
- Xcode 与 macOS 系统版本的兼容问题
- Photometric Stereo 光度立体三维重建(四)——光源标定
- php 显示探针_UPUPW PHP探针安全版19.08.06
- 如何解决电脑桌面图标显示为空白文件?
- 计算机基础及msoffice应用内容,计算机一级计算机基础及 ms office 应用考些什么 自考计算机应用基础,要考哪些内容?...
- 无线通信与生活-(1)
- excel分列---多页批量操作--vba宏实现
- ECharts数据可视化饼状图(环形图-进度半圆形)
- 长理2019选拔赛1.0
- EasyPR--一个开源的中文车牌识别系统
- usb_cam相机标定实践 ROS
热门文章
- Use mingw on windows
- positive definite quadratic form and positive definite matrix
- VS2008下改变项目的默认属性
- 爬虫-爬取感兴趣图片(python code 直接运行)
- 【java】JApplet类相关方法的使用
- redis中value大小_查看redis的Value值大小
- eja智能压力变送器工作原理_电量变送器是什么?电量变送器工作原理解析
- java doget 和dopost_Servlet中的doGet和doPost
- MySQL笔记 4月记
- 小程序_小程序开发,小程序定制开发,小程序搭建,小程序系统开发