这是我参与「第五届青训营 」伴学笔记创作活动的第 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分组排序,会先查询所有数据后再统一排序,而不是一开始就排序。
- 等等