mysql hint是什么

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

mysql hint是什么

本教程操作环境: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还未来得及被插入的数据将会丢失。

Layx是一款网页弹窗Javript插件 Layx是一款网页弹窗Javript插件

Layx 是一款网页弹窗Javript插件,她将助力于互联网Web开发,提供优质的弹窗体验

Layx是一款网页弹窗Javript插件 32 查看详情 Layx是一款网页弹窗Javript插件

强制连接顺序 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视频教程】

以上就是mysql hint是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/280378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
电脑开机风扇声音很大怎么回事 5种方法帮你解决
上一篇 2025年11月4日 16:15:30
如何用算法优化发票开具,减少发票浪费?
下一篇 2025年11月4日 16:15:36

相关推荐

  • mysql怎么将字符串转为datetime类型

    mysql怎么将字符串转为datetime类型mysql怎么将字符串转为datetime类型mysql怎么将字符串转为datetime类型mysql怎么将字符串转为datetime类型

    两种转换方法:1、使用str_to_date()函数,可以格式化字符串,根据指定格式将其转为日期时间值,语法“str_to_date(字符串值, 转换格式)”。2、使用CAST()函数,可以将指定字符串值转换为datetime数据类型,语法“CAST(字符串值 AS datetime)”。 本教程操…

    2026年8月30日 用户投稿
    000
  • laravel框架支持的几种数据库系统

    Laravel框架支持MySQL、PostgreSQL、MariaDB、SQL Server、SQLite和Oracle Database等数据库系统。选择数据库系统取决于特定应用程序的规模、性能、特性、成本和支持需求。 Laravel 框架支持的数据库系统 Laravel 是一个 PHP Web …

    2026年8月30日
    000
  • 怎么查看mysql是多少位

    怎么查看mysql是多少位怎么查看mysql是多少位怎么查看mysql是多少位怎么查看mysql是多少位

    查看mysql位数的两种方法:1、在cmd命令窗口中,使用cd命令进入mysql安装目录的bin目录中,再执行“mysql -V”或“mysql –version”命令,即可在输出结果中查看到位数信息。2、在mysql控制台中,执行“show variables like ‘…

    2026年8月30日 用户投稿
    000
  • laravel支持几种数据库

    Laravel 支持多种数据库连接,包括:MySQL、PostgreSQL、SQLite、SQL Server、MariaDB、MongoDB 和 Redis。要连接到数据库,您需要在 .env 文件中设置配置并使用 DB 外观进行连接。 Laravel 支持的数据库 Laravel 是一个 PHP…

    2026年8月30日
    000
  • mysql是否支持分区

    mysql是否支持分区mysql是否支持分区mysql是否支持分区mysql是否支持分区

    mysql从5.1版本开始支持分区功能。MySQL5.1中分区表达式必须是整数,或者返回整数的表达式;而MySQL5.5中提供了非整数表达式分区的支持。MySQL数据库的分区是局部分区索引,一个分区中既存了数据,又放了索引;也就是说,每个区的聚集索引和非聚集索引都放在各自区的(不同的物理文件)。My…

    2026年8月30日 用户投稿
    100
  • mysql怎么查询字段名称

    mysql怎么查询字段名称mysql怎么查询字段名称mysql怎么查询字段名称mysql怎么查询字段名称

    查询方法:1、在cmd窗口中,执行“mysql -u root -p”命令登录MySQL数据库;2、使用USE命令切换到指定数据库下,语法“USE 数据库名;”;3、使用DESCRIBE或DESC命令来查询字段名称,语法“DESCRIBE 表名;”或“DESC 表名;”,输出结果是表格形式,展示了表…

    2026年8月30日 用户投稿
    000
  • mysql怎么删除数据库

    mysql怎么删除数据库mysql怎么删除数据库mysql怎么删除数据库mysql怎么删除数据库

    删除方法:1、使用“win+r”键打开“运行”窗口,输入“cmd”,回车进入cmd命令窗口;2、在cmd窗口中,执行“mysql -u root -p”命令登录MySQL服务器;3、执行“DROP DATABASE IF EXISTS 数据库名;”命令来删除指定数据库中的所有表并永久删除该数据库,“…

    2026年8月30日 用户投稿
    000
  • mysql怎么将值转换为二进制

    mysql怎么将值转换为二进制mysql怎么将值转换为二进制mysql怎么将值转换为二进制mysql怎么将值转换为二进制

    3种转换方法:1、使用BIN()函数,可以返回指定数字的二进制值的字符串表示形式,语法“BIN(number)”,参数“number”是一个长整型(BIGINT)数。2、使用CONV()函数,可将一个进制转为另一个进制,语法“CONV(number,10,2)”,能返回指定数字的二进制值。3、使用B…

    2026年8月30日 用户投稿
    400
  • 一起聊聊MySQL全局锁

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于全局锁的相关问题,全局锁就是对整个数据库加锁。当我们对数据库加了读锁之后,其他任何的请求都不能对数据库加写锁了,下面一起来看一下,希望对大家有帮助。 推荐学习:mysql视频教程 数据库设计的初衷是处理并发问题的,作为多用户共享的资源,…

    2026年8月30日
    500
  • mysql中sum()函数怎么用

    mysql中sum()函数怎么用mysql中sum()函数怎么用mysql中sum()函数怎么用mysql中sum()函数怎么用

    在mysql中,sum()函数用于计算一组值或表达式的总和,语法为“SUM(DISTINCT expression)”,DISTINCT运算符允许计算集合中的不同值。sum()函数需要配合SELECT语句一起使用,如果在没有返回匹配行SELECT语句中使用SUM()函数,则SUM()函数会返回NUL…

    2026年8月30日 用户投稿
    000
  • Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置

    Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置Sublime连接Docker MySQL容器数据库_支持容器化开发环境统一配置

    要使用 sublime 连接运行在 docker 容器中的 mysql 数据库,首先要确保容器配置正确并开放远程访问权限。具体步骤包括:1. 启动容器时添加 -p 3306:3306 参数实现端口映射;2. 创建允许从外部连接的 mysql 用户,如 ‘root’@&#821…

    2026年8月30日 用户投稿
    000
  • 怎么让mysql不区分大小写

    让mysql不区分大小写的方法:1、进入mysql的安装目录,找到并打开配置文件“my.ini”;2、在配置文件的最后一行加上“lower_case_table_names=1”语句,设置大小写敏感参数“lower_case_table_names”,让mysql对大小写不敏感;3、重启mysql服…

    2026年8月30日
    000
  • mysql的安装路径怎么查看

    mysql的安装路径怎么查看mysql的安装路径怎么查看mysql的安装路径怎么查看mysql的安装路径怎么查看

    查看方法:1、鼠标右击“计算机”图标,在打开的菜单中点击“管理”;2、依次点击“服务和应用程序”-“服务”;3、在右侧服务列表中,找到mysql服务;4、选中mysql服务,点击鼠标右键,在打开的菜单中选择“属性”;5、在“mysql属性”弹窗中,查看“可执行文件路径”选项的值即可,该选项的值就是M…

    2026年8月30日 用户投稿
    500
  • mysql怎么关闭事务

    mysql怎么关闭事务mysql怎么关闭事务mysql怎么关闭事务mysql怎么关闭事务

    mysql关闭事务的步骤:1、使用“win+r”键打开“运行”窗口,输入cmd并回车,打开cmd命令窗口;2、在cmd窗口中,执行“mysql -u root -p”命令并输入密码来登录mysql服务,进入MySQL界面;3、在MySQL命令界面中,执行“start transaction;”或者“…

    2026年8月30日 用户投稿
    200
  • mysql中执行存储过程的语句是什么

    mysql中执行存储过程的语句是“CALL”。CALL语句可以调用指定存储过程,调用存储过程后,数据库系统将执行存储过程中的SQL语句,然后将结果返回给输出值;语法为“CALL 存储过程的名称([参数[…]]);”。mysql中利用CALL语句调用并执行存储过程需要拥有EXECUTE权限…

    2026年8月30日
    200
  • mysql与oracle有区别吗

    mysql与oracle有区别:1、Oracle是一个对象关系数据库管理系统(ORDBMS),而MySQL是一个关系数据库管理系统(RDBMS);2、Oracle是闭源的(收费),MySQL是开源的(免费);3、Oracle是大型数据库,而MySQL是中小型数据库;4、Oracle可设置用户权限、访…

    2026年8月30日
    100
  • 怎么查询mysql中所有表

    怎么查询mysql中所有表怎么查询mysql中所有表怎么查询mysql中所有表怎么查询mysql中所有表

    查询mysql数据库中所有表的方法:1、执行“mysql -u root -p”命令并输入密码来登录mysql数据库服务器;2、执行“USE 数据库名;”命令来切换到指定数据库;3、执行“show tables;”或“SHOW FULL TABLES;”命令,会以表格形式列出mysql数据库中的所有…

    2026年8月30日 用户投稿
    100
  • MySQL全文检索和第三方搜索引擎整合方案有哪些_优缺点分析?

    MySQL全文检索和第三方搜索引擎整合方案有哪些_优缺点分析?MySQL全文检索和第三方搜索引擎整合方案有哪些_优缺点分析?MySQL全文检索和第三方搜索引擎整合方案有哪些_优缺点分析?MySQL全文检索和第三方搜索引擎整合方案有哪些_优缺点分析?

    mysql 自带的全文检索功能在面对复杂搜索需求时存在明显不足,常见的整合方案包括 elasticsearch + mysql、sphinx + mysql 和 lucene/solr + mysql。1. mysql 全文检索缺点:仅支持基础分词和自然语言搜索,对中文支持弱,索引更新成本高,不支持…

    2026年8月30日 用户投稿
    100
  • mysql怎么实现分组求和

    实现方法:1、利用SELECT语句查询指定表中的数据;2、利用“GROUP BY”关键字根据一个或多个字段对查询结果进行分组;3、利用SUM()函数根据分组情况分别返回不同组中指定字段的总和,语法为“SELECT SUM(进行求和的字段名) FROM 表名 GROUP BY 需要进行分组的字段名;”…

    2026年8月30日
    100
  • mysql怎么将字段修改为not null

    mysql怎么将字段修改为not nullmysql怎么将字段修改为not nullmysql怎么将字段修改为not nullmysql怎么将字段修改为not null

    在mysql中,可以通过使用ALTER TABLE语句给字段添加非空约束来将字段修改为not null,语法“ALTER TABLE 数据表名 CHANGE COLUMN 字段名 字段名 数据类型 NOT NULL;”。ALTER TABLE语句用于修改原有表的结构,而“NOT NULL”是设置非空…

    2026年8月30日 用户投稿
    100

发表回复

登录后才能评论
关注微信