博客
关于我
mysql执行顺序与索引算法
阅读量:790 次
发布时间:2023-02-12

本文共 1094 字,大约阅读时间需要 3 分钟。

MySQL执行顺序与索引算法

书写顺序

MySQL查询的书写顺序遵循以下规则:

  • 必须字段

    • select:指定要查询的字段。
    • from:指定数据来源表。
  • 可选字段

    • distinct:去重。
    • join:表关联。
    • on:关联条件。
    • where:过滤条件。
    • group by:分组。
    • having:聚合后过滤。
    • sum、count、max、avg:聚合函数。
    • order by:排序。
    • limit:限制结果数量。
  • 执行顺序

    MySQL执行查询时遵循以下顺序:

  • from 阶段开始。
  • on 阶段处理关联条件。
  • join 阶段将相关表连接。
  • where 阶段过滤数据。
  • group by 阶段对数据进行分组。
  • having 阶段对聚合结果进行过滤。
  • select 阶段指定最终显示的字段。
  • distinct 阶段去重。
  • order by 阶段排序。
  • limit 阶段限制结果数量。
  • 提问解答

    Q:为什么字段别名不能在 where 中使用,但可以在 order by 中使用?

    A:

    • select 语句的执行顺序在 where 之后,因此在 where 阶段之前无法使用字段别名。
    • order by 阶段在 select 之后,可以使用字段别名。

    关键词含义

    from

    • 指定查询的数据表。

    join

    • 关联查询表。
    • 驱动表选择原则:优先选择结果集最少的表。

    on

    • 关联条件。

    where

    • 过滤数据。
    • 执行顺序:自下而上、从右到左。

    group by

    • 分组。
    • 执行顺序:从左到右。

    avg

    • 计算平均值。

    having

    • 聚合后过滤。

    select

    • 指定显示字段。

    distinct

    • 去重。

    order by

    • 排序。
    • 执行顺序:从左到右。

    limit

    • 截取结果。

    索引关联中使用的算法

    Nested-Loop join 算法

    • Simple Nested-Loop Join (SNLJ):驱动表记录与被驱动表全表匹配。
    • Index Nested-Loop Join (INLJ):基于索引进行匹配,减少匹配次数。
    • Block Nested-Loop Join (BNLJ):批量缓存匹配,减少内层表遍历次数。
    • Batched Key Access Join (BKAJ):利用索引排序,减少随机IO。

    Join Buffer

    • 缓存参与查询的所有列。
    • 默认缓存大小为256K。
    • 使用 optimizer_switch = block_nested_loop 控制性能。

    Offer突击训练营

    • 面试保障:提供offer保障。
    • 学习目标:15-20天掌握技术成果。
    • 项目经验:提供真实开发细节。

    点击了解更多

    转载地址:http://jbdfk.baihongyu.com/

    你可能感兴趣的文章