MySQLOptimizer Hints 的适用范围为以下几种Query block, table,Index,Global
其它三种都是我们常见的类型,就第一个Query block 需要专门定义。
一、定义
QB_NAME(name)
定义很简单 以代码举列
select
/*+
qb_name(qb1)
*/
* from services b
inner join user a on b.userid = a.id
where a.tel like '136%'
order by b.CreatedTime desc
limit 10
如上面所示,就定义了 一个qb1的Query block 这个Query block 所管辖的表就是 from 后的 b,a两表
当遇到嵌套的时候。可以这样
explain
select
/*+
qb_name(qb1)
*/
* from order_bill_index a
inner join order_bill_detail b on a.id =b.order_id
where goods_id in
(
select
/*+
qb_name(qb2)
*/
c.id from goods_goods_info c
inner join goods_class d on c.class_id = d.id
)
qb1 管辖是a和b表, qb2管辖的是 c和d表
二、使用
Query Blocks 有三种使用情况。分别是
hint_name([@query_block_name]) hint_name([@query_block_name] tbl_name [, tbl_name] ...) hint_name(tbl_name[@query_block_name] [, tbl_name[@query_block_name]] ...)
a、第一种 hint_name([@query_block_name])
JOIN_FIXED_ORDER 就是这个用法
是指。hint是适用于哪个Query block
explain
select
/*+
qb_name(qb1)
JOIN_FIXED_ORDER(@qb1)
*/
* from services b
inner join user a on b.userid = a.id
where a.tel like '136%'
order by b.CreatedTime desc
limit 10
b、第二种 hint_name([@query_block_name] tbl_name [, tbl_name] …)
指定query_block块内的表的顺序。 如下面的join_order
explain
select
/*+
qb_name(qb1)
JOIN_ORDER(@qb1 a,b)
*/
* from services b
inner join user a on b.userid = a.id
where a.tel like '136%'
order by b.CreatedTime desc
limit 10

c、第三种 hint_name(tbl_name[@query_block_name] [, tbl_name[@query_block_name]] …)
指定表名@query_block_name
explain
select
/*+
qb_name(qb1)
JOIN_ORDER(a@qb1,b@qb1,a@qb2,b@qb2)
*/
* from order_bill_index a
inner join order_bill_detail b on a.id =b.order_id
where goods_id in
(
select
/*+
qb_name(qb2)
*/
a.id from goods_goods_info a
inner join goods_class b on a.class_id = b.id
)
如上面语句一样。由于我子查询表的别名得取得和外面一样了。所以就必须在表名后指定是哪个query_block


上面两个执行计划。可以看到不同的Query block 也可以指定join顺序。
MySQL优化器提示系列文章
MySQL 优化器提示(一)之 Join-Order Optimizer Hints
MySQL 优化器提示(二)之 Optimizer Hints for Naming Query Blocks
MySQL 优化器提示(三)之 Optimizer Hints for Variable-Setting Hint Syntax
最后修改时间:2023-07-03 11:08:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




