时间:2021-07-01 10:21:17 帮助过:4人阅读
意思就是说STRAIGHT_JOIN功能同join类似,但能让左边的表来驱动右边的表,能改表优化器对于联表查询的执行顺序。
接下来我们举个例子进行大致的分析:
select t1.* from table1 t1 inner join table2 t2 on t1.id= t2.id where t1.code= 1
以上sql大数据量下执行需要30s,是不是很奇怪?明明Table1表的FilterID字段建了索引啊,Table1和Table2的CommonID也建了索引啊。通过explain来分析,你会发现执行计划中表的执行顺序是Table2->Table1。这个时候要略微介绍下驱动表的概念,mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。
但如下sql的执行时间都少于1s:
select t1.* from table1 t1 where t1.code= 1
或
select t1.* from table1 t1 inner join table2 t2 on t1.id= t2.id
公司的DBA使佣STRAIGHT_JOIN进行,我们对sql进行改造如下:
select t1.* from table1 t1 STRAIGHT_JOIN table2 t2 on t1.id= t2.id where t1.code= 1
用explain进行分析,发现执行顺序为Table1->Table2,这时就由Table1来作为驱动表了,Table1中相应的索引也就用上了,执行时间竟然低于1s了。
分析到这里,必须要重点说下:
mysql-STRAIGHT_JOIN-优化
标签:意思 提升 cas his 计划 select order pre 部分