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