06丨数据库原理:为什么PrepareStatement性能更好更安全?
李智慧
该思维导图由 AI 生成,仅供参考
做应用开发的同学常常觉得数据库由 DBA 运维,自己会写 SQL 就可以了,数据库原理不需要学习。其实即使是写 SQL 也需要了解数据库原理,比如我们都知道,SQL 的查询条件尽量包含索引字段,但是为什么呢?这样做有什么好处呢?你也许会说,使用索引进行查询速度快,但是为什么速度快呢?
此外,我们在 Java 程序中访问数据库的时候,有两种提交 SQL 语句的方式,一种是通过 Statement 直接提交 SQL;另一种是先通过 PrepareStatement 预编译 SQL,然后设置可变参数再提交执行。
Statement 直接提交的方式如下:
PrepareStatement 预编译的方式如下:
看代码,似乎第一种方式更加简单,但是编程实践中,主要用第二种。使用 MyBatis 等 ORM 框架时,这些框架内部也是用第二种方式提交 SQL。那为什么要舍简单而求复杂呢?
要回答上面这些问题,都需要了解数据库的原理,包括数据库的架构原理与数据库文件的存储原理。
数据库架构与 SQL 执行过程
我们先看看数据库架构原理与 SQL 执行过程。
关系数据库系统 RDBMS 有很多种,但是这些关系数据库的架构基本上差不多,包括支持 SQL 语法的 Hadoop 大数据仓库,也基本上都是相似的架构。一个 SQL 提交到数据库,经过连接器将 SQL 语句交给语法分析器,生成一个抽象语法树 AST;AST 经过语义分析与优化器,进行语义优化,使计算过程和需要获取的中间数据尽可能少,然后得到数据库执行计划;执行计划提交给具体的执行引擎进行计算,将结果通过连接器再返回给应用程序。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
数据库原理中的PrepareStatement是一项重要的技术,本文深入解释了其优势和原理。文章首先介绍了数据库架构与SQL执行过程,强调了连接器、语法分析器、语义分析与优化器以及执行引擎在SQL执行过程中的作用。然后,文章指出了使用PrepareStatement执行SQL的好处,包括提前生成执行计划以提高执行效率,以及防止SQL注入攻击的重要性。通过对比Statement直接提交SQL和PrepareStatement预编译SQL的方式,文章阐述了为什么PrepareStatement更为推荐。最后,文章以实际案例说明了使用PrepareStatement可以有效避免SQL注入攻击的危害。总之,本文为读者提供了宝贵的技术知识和实践建议,使他们能够快速了解PrepareStatement的优势和原理。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端技术面试 38 讲》,新⼈⾸单¥59
《后端技术面试 38 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(25)
- 最新
- 精选
- Zend请问老师,在进行事务操作时,事务日志文件会记录更新前的数据记录,这个记录更新前的数据记录是 什么意思,是把更新之前的数据都查询出来,记录到事务日志文件嘛
作者回复: 是的,更新数据本来就会先执行查询操作。
2019-12-015 - Snooker看文章讲解,聚簇索引,不止备份了整个表数据,增删改查开销也大,所以应减少不必要的聚簇索引,除主键外其他可考虑使用非聚簇索引。 那如何指定索引为非聚簇索引呢?
作者回复: 主键索引就是聚簇索引,非主键索引就是非聚簇索引
2020-07-014 - Zend请问一下老师PreparedStatement经过语法分析生成的抽象语法树,再经过语义分析和优化器处理后生成的执行计划,会有缓存吗?
作者回复: 会
2019-12-0124 - 开心小毛请问李老师,既然数据库连接会占用内存,那么传统web应用为什么不干脆在每一次接受http请求时建立数据库连接,然后再在http访问结束后断开数据库连接? 建立数据库连接会耗CPU吗?(假设数据库服务自身已经有线程池等待被连接,web应用也缓存了地址密码等配置信息)
作者回复: 建立数据库连接会很耗时,每次建立连接会更消耗数据库的资源。
2020-02-1531 - pcz老师:PrepareStatement提交带占位符的sql进行预处理的意思是:执行到语义分析和优化器这一步,但是不执行引擎?那这个sql的赋值过程是什么样的?
作者回复: ast优化后,依然是一个ast,赋值的时候,将真实值替换ast的expression节点即可
2021-02-22 - 探索无止境老师您好,文中提到“每个节点存储 1000 多个数据,这样树的深度最多只要 4 层,就可存储数亿的数据”,严谨来说应该是三层即可,1000*1000*1000,我是这么计算的
作者回复: 树要有个根节点,算一层~
2020-03-03 - 乘坐Tornado的线程魔法师请问下,文中的第一个B+树示意图的第一层中间节点,8和34中间的部分是不是也应该指向一个子节点?
作者回复: 是的,图中只是示意,没有画出全部节点。
2019-11-302 - ⛽️🦆您好,老师: 回答上述问题 1.创建多的索引,会占用更多磁盘空间。如果有一张很大的表,索引文件的大小可能达到操作系统允许的最大文件限制; 2.对于DML操作的时候,索引会降低他们的速度。因为MySQL不仅要把搞定的数据写入数据文件,而且它还要把这些改动写入索引文件; 改善数据库性能: 1.索引优化,选择合适的索引列,选择在where、group by、order by、on 从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引。 2.索引字段越小越好。 3.SQL语句的优化、数据表结构的优化。 3.1:选择可存数据最小的数据类型,选择最合适的字段类型,进行数据的存储; 3.2:数据量很大的一张表,应该考虑水平分表或垂直分表; 3.3:尽量不要使用text字段,如果非要用,那么应考虑将它存放另一张表中; 4.数据库配置的优化: 4.1:连接数的配置,因为大量的连接,不进行操作,那样也会占用内存。 4.2:查询缓存的配置,但在MySQL 8.0就删除了此功能。 5.硬件的配置; 额外加说一下,常见性能的问题: 1.条件字段函数的操作,给索引字段做了函数计算,就会破坏索引值,因此优化器就放弃了走树搜索能够; 2.隐式类型转换,比如数据库字段是varchar类型,创建的索引,但是使用的时候传入的是int类型,那么会走全表扫面; 3.隐式字符编码转换,如果join 两表的时候,两表的字符集不同,也不能用上索引;2019-11-296113
- 无形最近在广告检索中接入了用户画像标签,实现了把一大串嵌套json格式的标签数据表达式,类似dnf表达式,解析为可计算的广告匹配模型,其中就有类似sql一样,对表达式进行格式分析、数据、比较符检验、复杂的逻辑关系转换为容易处理的计算单元,最后生成一个树状匹配模型,通过对模型输入用户数据,进行匹配,并返回符合的用户。 这有点像用户画像标签就是一条SQL,对SQL进行语法分析,生成匹配模型(类比SQL的执行计划),当下次输入用户数据的时候用生成好的匹配模型直接处理数据,不必再重复解析画像标签2019-12-018
- 尹宗昌索引可以提高查询性能,但是一定要考虑维护索引的成本。空间占用、插入修改的性能影响都要衡量2019-11-297
收起评论