数据库架构与 SQL 执行过程
(1)一个 SQL 提交到数据库,经过连接器将 SQL 语句交给语法分析器,生成一个抽象语法树 AST;
(2)AST 经过语义分析与优化器,进行语义优化,使计算过程和需要获取的中间数据尽可能少,然后得到数据库执行计划;
(3)执行计划提交给具体的执行引擎进行计算,将结果通过连接器再返回给应用程序。
应用程序提交 SQL 到数据库执行,首先需要建立与数据库的连接,数据库连接器会为每个连接请求分配一块专用的内存空间用于会话上下文管理。建立连接会消耗大量资源,一般使用连接池。但是这些连接,无论是否执行SQL都会消耗一定的数据库内存资源。
所以应用程序需要对数据库连接进行管理,一方面通过连接池对连接进行管理,空闲连接会被及时释放;另一方面微服务架构可以大大减少数据库连接。
语法分析器可以实现语法校验,并且与优化器一块进一步做语义优化,也就是在保证 SQL 语义不变的前提下,进行语义等价转换,使最后的计算量和中间过程数据量尽可能小。SQL 语义分析与优化器就是要将各种复杂嵌套的 SQL 进行语义等价转化,得到有限几种关系代数计算结构,并利用索引等信息进一步进行优化。
使用 PrepareStatement 执行 SQL的好处
(1) PrepareStatement 会预先提交带占位符的 SQL 到数据库进行预处理,提前生成执行计划,当给定占位符参数,真正执行 SQL 的时候,执行引擎可以直接执行,效率更好一点。
(2)PrepareStatement 可以防止 SQL 注入攻击。
数据库文件存储原理
B+ 树的节点存储在磁盘上,每个节点存储 1000 多个数据,这样树的深度最多只要 4 层,就可存储数亿的数据。如果将树的根节点缓存在内存中,则最多只需要三次磁盘访问就可以检索到需要的索引数据。
数据库索引
聚簇索引的数据库记录和索引存储在一起,索引 1 和记录行 r1 存储在一起,查找到索引就是查找到数据库记录。
非聚簇索引在叶子节点记录的就不是数据行记录,而是聚
簇索引,也就是主键