mysql hint的概念是什么

mysql hint的概念是什么

mysql中,hint指的是“查询优化提示”,会提示优化器按照一定的方式来生成执行计划进行优化,让用户的sql语句更具灵活性;Hint可基于表的连接顺序、方法、访问路径、并行度等规则对DML(数据操纵语言,Data Manipulation Language)语句产生作用。

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

我们在操作表、字段或索引时可以添加 comment 来增强代码可读性,以便他人快速读懂代码,这是对使用数据库的人的一种提示;同样的,还有一种提示,叫做hint,是给数据库的提示。

何谓 hint

hint指的是“查询优化提示”,它会提示优化器按照一定的方式去优化,让你的sql语句更具灵活性,这会让你的查询更快,当然也可能更慢,这完全取决于你对优化器的理解和场景的了解。

我们知道在执行一条SQL语句时,MySQL会生成一个执行计划,而hint就是告诉查询优化器需要按照我们告诉它的方式来生成执行计划。

Hint可基于表的连接顺序、方法、访问路径、并行度等规则对DML(数据操纵语言,Data Manipulation Language)语句产生作用,范围如下:

使用的优化器类型;基于代价的优化器的优化目标,是all_rows还是first_rows;表的访问路径,是全表扫描,还是索引扫描,还是直接用rowid;表之间的连接类型;表之间的连接顺序;语句的并行程度;

常用 hint

  • 强制索引 FORCE INDEX
    SELECT * FROM tbl FORCE INDEX (FIELD1) …

  • 忽略索引 IGNORE INDEX
    SELECT * FROM tbl IGNORE INDEX (FIELD1, FIELD2) …

  • 关闭查询缓冲 SQL_NO_CACHE
    SELECT SQL_NO_CACHE field1, field2 FROM tbl;
    需要查询实时数据且频率不高时,可以考虑把缓冲关闭,即不论此SQL是否曾被执行,MySQL都不会在缓冲区中查找。

  • 强制查询缓冲 SQL_CACHE
    SELECT SQL_CACHE * FROM tbl;
    功能同上一条相反,但仅在my.ini中的query_cache_type设为2时起作用。

  • 优先操作 HIGH_PRIORITY
    HIGH_PRIORITY可以使用在select和insert操作中,让MYSQL知道,这个操作优先进行。
    SELECT HIGH_PRIORITY * FROM tbl;

  • 滞后操作 LOW_PRIORITY
    LOW_PRIORITY可以使用在insert和update操作中,让mysql知道,这个操作滞后。
    update LOW_PRIORITY tbl set field1= where field1= …

  • 延时插入 INSERT DELAYED
    INSERT DELAYED INTO tbl set field1= …
    指客户端提交插入数据申请,MySQL返回OK状态却并未实际执行,而是存储在内存中排队,当mysql有空余时再插入。
    一个重要的好处是,来自多个客户端的插入请求被集中在一起,编写入一个块,比独立执行许多插入要快很多。
    坏处是,不能返回自增ID,以及系统崩溃时,MySQL还未来得及被插入的数据将会丢失。

  • 强制连接顺序 STRAIGHT_JOIN
    SELECT tbl.FIELD1, tbl2.FIELD2 FROM tbl STRAIGHT_JOIN tbl2 WHERE …
    由上面的SQL语句可知,通过STRAIGHT_JOIN强迫MySQL按tbl、tbl2的顺序连接表。如果你认为按自己的顺序比MySQL推荐的顺序进行连接的效率高的话,就可以通过STRAIGHT_JOIN来确定连接顺序。

不常用
  • 强制使用临时表 SQL_BUFFER_RESULT
    SELECT SQL_BUFFER_RESULT * FROM tbl WHERE …
    当我们查询的结果集中的数据比较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中,这样就可以很快地释放MySQL的表锁(这样其它的SQL语句就可以对这些记录进行查询了),并且可以长时间地为客户端提供大记录集。

  • 分组使用临时表 SQL_BIG_RESULT和SQL_SMALL_RESULT
    SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM tbl GROUP BY FIELD1;
    对SELECT语句有效,告诉MySQL优化去对GROUP BY和DISTINCT查询如何使用临时表排序,SQL_SMALL_RESULT表示结果集很小,可以直接在内存的临时表排序;反之则很大,需要使用磁盘临时表排序。

  • SQL_CALC_FOUND_ROWS
    它其实不是优化器提示,也不影响优化器的执行计划,但会让mysql返回的结果集中包含本次操作影响的总行数,需与 FOUND_ROWS() 联用。
    SQL_CALC_FOUND_ROWS 通知MySQL将本次处理的行数记录下来; FOUND_ROWS() 用于取出被记录的行数,可以应用到分页场景。
    一般的分页写法为:先查总数,计算页数,再查询某一页的详情。
    SELECT COUNT(*) from tbl WHERE …
    SELECT * FROM tbl WHERE … limit m,n
    但借助SQL_CALC_FOUND_ROWS,可以简化成如下写法:
    SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE … limit m,n;
    SELECT FOUND_ROWS();
    第二条SELECT将返回名列前茅条SELECT不带limit时的总行数,如此只需执行一次较耗时的复杂查询就可同时得到总行数。

  • LOCK IN SHARE MODE、 FOR UPDATE
    同样的,这俩也不是优化提示,是控制SELECT语句的锁机制,只对行级锁有效,即InnoDB支持。

扩展知识:

概念和区别

SELECT ... LOCK IN SHARE MODE添加的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,其他session可读取记录,亦可继续添加IS锁,但无法修改,直到这个加锁的session done(否则直接锁等待超时)。

SELECT ... FOR UPDATE 添加的是IX锁(意向排它锁),即符合条件的rows上都加了排它,其他session无法给这些记录添加任何S锁或X锁。如果不存在一致性非锁定读的话,则其他session是无法读取和修改这些记录的,但innodb有非锁定读(快照读不需要加锁)。
因此,for update的加锁方式只是比lock in share mode的方式多阻塞了select...lock in share mode的查询方式,并不会阻塞快照读。

应用场景

LOCK IN SHARE MODE的适用于两张存在关系的表的写场景,以mysql官方例子来说,一个表是child表,一个是parent表,假设child表的某一列child_id映射到parent表的c_child_id列,从业务角度讲,此时直接insert一条child_id=100记录到child表是存在风险的,因为insert的同时可能存在parent表执行了删除c_child_id=100的记录,业务数据有不一致的风险。正确方法是先执行select * from parent where c_child_id=100 lock in share mode,锁定parent表的这条记录,然后执行insert into child(child_id) values (100)

关于“mysql hint的概念是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“mysql hint的概念是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

文章标题:mysql hint的概念是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/27654

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月21日 上午12:06
下一篇 2022年9月21日 上午12:07

相关推荐

  • html有哪些常用的结构元素

    html常用的结构元素有:1、div,可定义文档中的分区或节,用于为HTML文档内大块(block-level)的内容提供结构和背景;2、section,表示文档中的一个区域;3、article,表示文档、页面、应用或网站中的独立结构,其意在成为可独立分配的或可复用的结构;4、aside,表示一个和…

    2022年9月16日
    70400
  • vlookup函数精确匹配怎么选择

    vlookup函数精确匹配是1还是0 答:vlookup函数精确匹配是0 1、0代表的是精确匹配,1代表的是模糊匹配。 2、此外,FALSE也可以代表精确匹配,true代表近似匹配。 3、使用精确匹配,就是必须要查找值必须完全匹配,才会导出结果。 4、而模糊匹配有类似值就会匹配到结果中。 5、我们可…

    2022年9月22日
    1.0K00
  • mysql有没有触发器

    mysql有触发器。MySQL触发器是存储在数据库目录中的一组SQL语句集合,是MySQL中管理数据的有力工具,主要用于保护表中的数据。MySQL支持三种触发器:1、INSERT触发器,是在INSERT语句执行之前或之后响应的触发器;2、UPDATE触发器,是在UPDATE语句执行之前或之后响应的触…

    2022年9月21日
    57300
  • 如何实现sqlmap time-based inject的分析

    1. 前言 sql注入如何检测的? 我的回答是:在甲方做安全,sql注入检测还是比较好做的。 1) 报错注入检测。 2) 别做bool的报错注入,误报比较高。 3) 做基于time-based的时间注入,联系运维做上慢日志db记录,监控sleep,benchmark的关键字监控,可以在sleep的时…

    2022年9月21日
    62400
  • mysql不是内部命令如何解决

    解决方法:1、右击“计算机”图标,在打开的菜单中选择“属性”;2、在系统界面中,点击“高级系统设置”;3、在“系统属性”弹窗中,点击“环境变量”;4、在“环境变量”弹窗的“系统变量”区域中,选中“Path”,点击“编辑”;5、在打开的“编辑环境变量”窗口中,填入Mysql安装目录中的bin目录路径,…

    2022年9月24日
    93400
  • windows你需要权限来执行此操作删除不了怎么解决

    解决方法: 1、首先右键存在问题的文件夹,打开“属性” 2、接着进入上方“安全”并点击“编辑” 3、然后选中我们正在使用的用户。 (如果没有就添加一个) 4、最后在下面全部勾选“允许”并确定保存即可。 关于“windows你需要权限来执行此操作删除不了怎么解决”这篇文章的内容就介绍到这里,感谢各位的…

    2022年8月31日
    1.6K00
  • windows浩辰看图王cad中怎么统计相同块的数量

    浩辰看图王cad中统计相同块的数量: 1、首先我们打开一张cad图纸,然后进入“扩展工具” 2、接着点开其中的“快统计”功能。 3、然后使用鼠标左键点击其中想要统计的色块。 4、在其中可以设置不同的图像选项。 5、设置完成后,点击“统计”,就可以在块数量中看到统计结果了。 以上就是“windows浩…

    2022年9月21日
    65100
  • Javascript怎样替换数组中的特定值

    替换数组中的特定值 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。特别需要注意插入值的位置! // arrayObject.splice(index,howmany,item1,…..,itemX)var plants = [‘Saturn’, ‘…

    2022年8月31日
    66200
  • windows浩辰cad看图王怎么使用

    浩辰cad看图王使用方法: 1、首先我们下载安装这款软件 2、下载安装完成后,双击软件图标来打开它。 3、点击左上角的软件图标,选择“打开” 4、然后在其中找到并选中想要打开的图纸,点击“打开” 5、这样我们就可以在其中查看或编辑图纸了。 6、软件拥有编辑模式和览图模式两种,用户可以根据自己的需求来…

    2022年9月20日
    80700
  • win11新建不了文本文档怎么解决

    在以往文章中,也有不少关于“win11新建不了文本文档怎么解决”的介绍,但内容并不是十分详尽。以下是小编最新整理的“win11新建不了文本文档怎么解决”相关知识,不仅内容详细,而且步骤、细节清晰,希望能够帮助大家解决一些工作中的疑惑。 方法一: 1、首先点开下面的“开始菜单” 2、在上方搜索看看能不…

    2022年6月27日
    1.5K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部