后端技术面试 38 讲
李智慧
同程艺龙交通首席架构师,前 Intel& 阿里架构师,《大型网站技术架构》作者
37373 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
不定期加餐 (1讲)
后端技术面试 38 讲
15
15
1.0x
00:00/00:00
登录|注册

06丨数据库原理:为什么PrepareStatement性能更好更安全?

非聚簇索引
聚簇索引
执行引擎
语义分析与优化器
语法分析器
连接器
防止SQL注入攻击
预先提交带占位符的SQL到数据库进行预处理
PrepareStatement预编译
Statement直接提交
改善数据库访问性能的技巧方法
索引使用的注意事项
应用开发者需要了解的内容
binlog日志文件
事务日志文件
数据库索引
索引加快查询速度的原理
SQL执行过程
数据库连接管理
使用PrepareStatement的好处
两种提交SQL语句的方式
SQL查询条件尽量包含索引字段的好处
思考题
小结
数据库文件存储原理
数据库架构与SQL执行过程
为什么PrepareStatement性能更好更安全?
数据库原理

该思维导图由 AI 生成,仅供参考

做应用开发的同学常常觉得数据库由 DBA 运维,自己会写 SQL 就可以了,数据库原理不需要学习。其实即使是写 SQL 也需要了解数据库原理,比如我们都知道,SQL 的查询条件尽量包含索引字段,但是为什么呢?这样做有什么好处呢?你也许会说,使用索引进行查询速度快,但是为什么速度快呢?
此外,我们在 Java 程序中访问数据库的时候,有两种提交 SQL 语句的方式,一种是通过 Statement 直接提交 SQL;另一种是先通过 PrepareStatement 预编译 SQL,然后设置可变参数再提交执行。
Statement 直接提交的方式如下:
statement.executeUpdate("UPDATE Users SET stateus = 2 WHERE userID=233");
PrepareStatement 预编译的方式如下:
PreparedStatement updateUser = con.prepareStatement("UPDATE Users SET stateus = ? WHERE userID = ?");
updateUser.setInt(1, 2);
updateUser.setInt(2,233);
updateUser.executeUpdate();
看代码,似乎第一种方式更加简单,但是编程实践中,主要用第二种。使用 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
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • Zend
    请问老师,在进行事务操作时,事务日志文件会记录更新前的数据记录,这个记录更新前的数据记录是 什么意思,是把更新之前的数据都查询出来,记录到事务日志文件嘛

    作者回复: 是的,更新数据本来就会先执行查询操作。

    2019-12-01
    5
  • Snooker
    看文章讲解,聚簇索引,不止备份了整个表数据,增删改查开销也大,所以应减少不必要的聚簇索引,除主键外其他可考虑使用非聚簇索引。 那如何指定索引为非聚簇索引呢?

    作者回复: 主键索引就是聚簇索引,非主键索引就是非聚簇索引

    2020-07-01
    4
  • Zend
    请问一下老师PreparedStatement经过语法分析生成的抽象语法树,再经过语义分析和优化器处理后生成的执行计划,会有缓存吗?

    作者回复: 会

    2019-12-01
    2
    4
  • 开心小毛
    请问李老师,既然数据库连接会占用内存,那么传统web应用为什么不干脆在每一次接受http请求时建立数据库连接,然后再在http访问结束后断开数据库连接? 建立数据库连接会耗CPU吗?(假设数据库服务自身已经有线程池等待被连接,web应用也缓存了地址密码等配置信息)

    作者回复: 建立数据库连接会很耗时,每次建立连接会更消耗数据库的资源。

    2020-02-15
    3
    1
  • 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-30
    2
  • ⛽️🦆
    您好,老师: 回答上述问题 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-29
    6
    113
  • 无形
    最近在广告检索中接入了用户画像标签,实现了把一大串嵌套json格式的标签数据表达式,类似dnf表达式,解析为可计算的广告匹配模型,其中就有类似sql一样,对表达式进行格式分析、数据、比较符检验、复杂的逻辑关系转换为容易处理的计算单元,最后生成一个树状匹配模型,通过对模型输入用户数据,进行匹配,并返回符合的用户。 这有点像用户画像标签就是一条SQL,对SQL进行语法分析,生成匹配模型(类比SQL的执行计划),当下次输入用户数据的时候用生成好的匹配模型直接处理数据,不必再重复解析画像标签
    2019-12-01
    8
  • 尹宗昌
    索引可以提高查询性能,但是一定要考虑维护索引的成本。空间占用、插入修改的性能影响都要衡量
    2019-11-29
    7
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部