SQL执行| 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

SQL语句如何诞生

SQL语句诞生于手写和ORM框架生成

数据库执行:

获取数据库链接对象

通过地址,账号,密码等信息,获取到链接。数据库连接池初始化了一些链接对象,并且管理了这些链接对象。注意客户端也有一个数据库连接池,两种连接池都是为了复用资源,节省开销,提升性能,只不过针对的方向不同。

如何执行sql

通过连接后进入了Mysql服务层。

  • 先进入sql接口,进行hash处理,然后缓存操作,然后接受返回结果
  • 根据sql接口查询缓存,有则,缓存放回数据
  • 缓存没有失败,将SQL交给解析器,判断SQL是否正确,失败返回1064错误码
  • 正确,根据SQL指定不同的执行方案,进行语法分析,语义分析根据关键字(select,updata,delete)生成语法树,优化器选择出最优方案。
  • 优化器获得语法树后,根据这条SQL获得一个最佳方案。
  • 特别的:对于写,执行之前会纪律undo-redo-log
  • 根据执行计划,调用存储引擎提供API获取数据。
  • 特别的:对于写,执行的时候会查询缓存是否存在数据,存在写入缓存利用checkpoint刷盘,不存在:调用存储引擎API,发生磁盘IO。最后记录bin-log,将redo-log记录为commit状态。
  • 进入磁盘查询,发生IO,然后逐条返回给sql接口
  • sql接口回对所有结果进行处理并返回。

优化原则:

  • 对于关联查询的优化,驱动表选择,小表驱动大表
  • 多条件查询时,重排条件先后顺序,将效率更好的字段条件放在前面。
  • 当表中存在多个索引时,选择效率最高的索引作为本次查询的目标索引。
  • 使用分页Limit关键字时,查询到对应的数据条数后终止扫表。
  • 多表join联查时,对查询表的顺序重新定义,同样以效率为准。
  • 对于SQL中使用函数时,如count()、max()、min()...,根据情况选择最优方案。

max()函数:走B+树最右侧的节点查询(大的在右,小的在左)。

min()函数:走B+树最左侧的节点查询。

count()函数:如果是MyISAM引擎,直接获取引擎统计的总行数。

  • 对于group by分组排序,会先查询所有数据后再统一排序,而不是一开始就排序。
  • 等等

参考

【伴学青训营】阅读打卡活动来袭! - 掘金 (juejin.cn)