没有合适的资源?快使用搜索试试~ 我知道了~
我们可以对MySQL的对象(表、索引、触发器、自建函数、存储过程等)做注释(comment),这样做的目的是标识该对象的作用等以增强代码的可读性、方便其他同事快速读懂我们写的代码或某个数据库对象的作用,说白了,comment就是对我们人的一个提示。在MySQL中还有一种提示,叫做hint,hint是对数据库的提示,我们都知道, 在执行一条SQL语句的时候,MySQL都会生成一个执行计划,而hint就是用来告诉优化器按照我们告诉它的方式生成执行计划。Hint可以基于表连接的顺序、表连接的方法、访问路径、并行度等规则对DML语句、或者查查询语句产生作用,通过它我们可以实现: 1) 使用的优化器的类型 2) 基于代价的优化器的优化目标,是all_rows还是first_rows。 3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。 4) 表之间的连接类型 5) 表之间的连接顺序 6) 语句的并行程度
资源推荐
资源详情
资源评论
MySQL hint
我们可以对MySQL的对象(表、索引、触发器、自建函数、存储过程等)做注释(comment),这样做的目的是标识该对象的作用等以增强代码的可读性、方便其他同
事快速读懂我们写的代码或某个数据库对象的作用,说白了,comment就是对我们人的一个提示。在MySQL中还有一种提示,叫做hint,hint是对数据库的提示,我们都
知道, 在执行一条SQL语句的时候,MySQL都会生成一个执行计划,而hint就是用来告诉优化器按照我们告诉它的方式生成执行计划。Hint可以基于表连接的顺序、表连
接的方法、访问路径、并行度等规则对DML语句、或者查查询语句产生作用,通过它我们可以实现:
1) 使用的优化器的类型
2) 基于代价的优化器的优化目标,是all_rows还是first_rows。
3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。
4) 表之间的连接类型
5) 表之间的连接顺序
6) 语句的并行程度
下面我们看下MySQL中hint都能实现那些功能:
1、Index Hints
在MySQL中,查询优化器用来解析查询语句,给出最优的查询路径,然而查询优化器并不是一直能给出最优的执行计划,比如某张表经过大量的insert和update操作后,
索引的分布会受到很大的影响(此时我们可以使用ANALYZE TABLE来重新分析表)。当优化器不能给出合理的执行计划时,我们可以使用索引hints来告诉MySQL优化器
使用某个索引或忽略某个索引,从而达到优化查询的目的。
语法:
tbl_name [[AS] alias] [index_hint_list]
index_hint_list:
index_hint [, index_hint] ...
index_hint:
USE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| IGNORE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
| FORCE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
index_list:
index_name [, index_name] ...
index_hint语句放在表名后面,index_list选项后面跟索引名,不要跟列名,对于一些列名和索引名相同的表可能后面跟列名也可以,但这样是不标准的,对于有主键索引
的表, USE | FORCE | IGNORE {INDEX|KEY} 后面必须跟primary代替在索引的名字。
SELECT * FROM t1 USE INDEX (PRIMARY) ...;
USE INDEX
后面添加你希望MySQL查询使用的索引列表,就可以让MySQL不再考虑其他可用的索引。
SELECT * FROM t1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
IGNORE INDEX
禁止查询优化器使用指定的索引。在具有多个索引的查询时,可以用来指定不需要优化器使用的那个索引,还可以在删除不必要的索引之前在查询中禁止使用该索引。
比如,在一个有主键索引的表中,默认的执行计划是按照主键索引进行扫描,如果我们使用IGNORE INDEX忽略主键索引,则会按照全表扫描执行。
SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
FORCE INDEX
强制MySQL使用一个或者多个索引
MySQL 通常会根据统计信息选择正确的索引,但是当查询优化器选择了错误的索引或者根本没有使用索引的时候,可以使用FORCE INDEX选项来让MySQL使用正确的
所以。
SELECT * FROM t1 FORCE INDEX (col1_index) ...;
在USE INDEX后面,如果省略了索引列表(USE INDEX ()WHERE ...)则表示不使用任何索引,如果在FORCE|IGNORE INDEX后面省略了索引名,则报错。
我们可以指定索引hint的范围:
index_hint:
USE | IGNORE | FORCE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
分别是用于表连接(JOIN)、排序(ORDER BY)、分组(GROUP BY)
如果不跟FOR语句来指定hint的范围,则默认是应用上述所有的范围,也就是说,下面2条语句是等同的:
IGNORE INDEX (i1)
IGNORE INDEX FOR JOIN (i1)
IGNORE INDEX FOR ORDER BY (i1)
IGNORE INDEX FOR GROUP BY (i1)
在MySQL 5.0及以前,如果不知道FOR选项,则默认只是在行检索使用hint,在MySQL 5.0以后的版本都是默认应用所有范围,当然我们还可以修改OLD参数来改变这一
功能:
mysql> show variables like 'old';
资源评论
Bam_BJ
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功