MySQL8.0 优化器介绍(二)


  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:   奥特曼爱小怪兽
  • 文章来源:GreatSQL社区投稿


上一篇 MySQL8.0 优化器介绍(一)介绍了成本优化模型的三要素:表关联顺序,与每张表返回的行数(过滤效率),查询成本。而join算法又是影响表关联效率的首要因素。

join算法(Join Algorithms)

join在MySQL 是一个如此重要的章节,毫不夸张的说,everything is a join。

截止到本文写作时,MySQL8.0.32 GA已经发行,这里主要介绍三大join:NL(Nested Loop),BNL(Block Nested Loop),HASH JOIN

嵌套循环(Nested Loop)

MySQL5.7之前,都只有NL,它实现简单,适合索引查找。

几乎每个人都可以手动实现一个NL。

SELECT CountryCode, country.Name AS Country, city.Name AS City, city.District FROM world.country INNER JOIN world.city ON city.CountryCode = country.Code WHERE Continent = 'Asia'; ##执行计划类似如下: -> Nested loop inner join -> Filter: (country.Continent = 'Asia') -> Table scan on country -> Index lookup on city using CountryCode (CountryCode=country.`Code`) ##python 代码实现一个NL result = [] for country_row in country: if country_row.Continent == 'Asia': for city_row in city.CountryCode['country_row.Code']: result.append(join_rows(country_row, city_row))