何为hint
在执行一条sql语句时,mysql会生成一个执行计划,而hint就是告诉查询优化器需要按照我们告诉它的方式来生成执行计划。
Hint可基于表的连接顺序、方法、访问路径、并行度等规则对DML(数据操纵语言,DataManipulation Language)语句产生作用,范围如下:
使用的优化器类型:
基于代价的优化器的优化目标,是all_rows还是firsr_rows;
表的访问路径,是全表扫描,还是索引扫描,还是直接用rowid;
表之间的连接类型;
表之间的连接顺序;
语句的并行程度;
常用的hint
强制索引 force index
select * from 表名 force index(field1)...;
以上的sql语句只使用建立在field1上的索引,而不使用其他字段上的索引。
忽略索引 ignore index
select * from 表名 ignore index (field1,field2)...;
上面的sql语句中,表中field1和field2上的索引不被使用。
关闭查询缓冲 sql_no_cache
select sql_no_cache * from 表名;
有一些sql语句需要实时的查询数据,或者并不经常使用,这样就需要把缓冲关了,不管这条sql语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行。
强制查询缓冲sql_cache
select sql_cache * from 表名;
如果在my.ini 中的query_cache_type设成2,这样只有在使用了sql_cache后,才使用查询缓存。
优先操作 high_priority
select high_priority * from 表名;
high_priority可以使用在select和insert操作中,让mysql知道,这个操作优先进行。
滞后操作 low_priority
update low_priority 表名 set field1='' where field2='';
low_priority 可以使用在insert和update操作中,让mysql知道,这个操作滞后。
延时插入 insert delayed
insert delayed into 表名 set field='';
insert delayed into,是客户端提交数据给mysql,mysql返回ok状态却并未实际执行,而是存储在内存中排队,当mysql有空余时再插入。一个重要的好处是,来自多个用户端的插入请求被集中在一起,编写一个块,比独立执行许多插入要快很多。坏处是不能返回自增ID,以及系统崩溃时,mysql还为来的及被插入的数据将会丢失。
强制连接顺序 straight_join
select table1 field1,table2 field2 from table1 straight_join table2 where ...;
由上面的sql语句可知,通过straight_join强迫mysql按table1、table2的顺序链接表。如果你以为按自己的顺序比mysql推荐的顺序进行连接的效率好的话,就可以通过straight_join来确定连接顺序。
强制使用临时表 sql_buffer_result
select sql_buffer_result * from 表名 where ...;
但我们查询的结果集中的数据比较多时,可以通过sql_buffer_result选项强制将结果集放到临时表中,这样就可以很快地释放mysql的表锁(这样其他的sql语句就可以对这些数据记录进行查询了),并且可以长时间地为客户端提供大量记录集。
分组使用临时表 sql_big_result和sql_small_result
select sql_buffer_result field1,count(*) from 表名 group by field1;
对SELECT语句有效,告诉MySQL优化去对GROUP BY和DISTINCT查询如何使用临时表排序,SQL_SMALL_RESULT表示结果集很小,可以直接在内存的临时表排序;反之则很大,需要使用磁盘临时表排序。
参考:https://blog.csdn.net/yangyang_VV/article/details/124104641