php+prepared,PreparedStatement,Statement

一个sql语句执行过程中,将经历这么几个步骤:传输sql到数据库。

数据库检查sql的语法合法性,并解析sql。

计算Access Plan。数据库会通过检测index,statistics来给出最优的访问计划。

根据访问计划进行检索,返回数据。

在上面步骤中,第1,2,3步是都是耗时的。因此,为了提高性能,数据库会缓存执行语句以及其部分Access Plan, 然后生成一个句柄, 将句柄返回给客户端。缓存的部分被称为statement cache。当客户端使用PreparedStatement的时候, 只需要调用此句柄, 使用二进制发送相应的参数, 而不需要再发送整个sql语句了,数据库会使用缓存中的access plan以节省cpu时间。

相比较statement, 时间节省在:网络传输, statement使用asicii编码传输整个sql语句, 而preparedstatement使用二进制传输句柄和参数, 流量变小很多.

不用再编译sql

可以使用已经有的部分优化.

看下面一段code:

sql1在第一次执行的时候,需要计算执行计划。但在第2和3次执行的时候,会使用缓存好的执行计划,因此后面的sql1不会再重新检验语法与计算执行计划,效率会比第一次高。

sql2却每次都在变化,在cache中,key为整个sql语句,所以每次sql2都无法命中cache,即使它仅仅参数不同,也必须重新检验语法与计算执行计划,效率自然就低下。

强大的数据库会在cache命中上做优化,但复杂的语句还是避免不了miss。

PreparedStatement的存在是为了避免sql2的劣势。看下面code。

PreparedStatement在创建的时候,会将参数化的语句发送给数据库,进行语法检测和执行计划计算。Cache中的key将是参数化的语句。当后面preparedstatement在执行的时候,每次均会命中cache,使用已存在的access plan进行检索。

包含以上优点,PreparedStatement的优点归为:

1. 预编译,节省后面使用的时间。

(因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中,就会得到执行)

2.可防止sql注入。

(注入只对sql语句的编译过程有破坏作用,后面传过来的只作参数用,而不参与编译,那就不会对含有sql的语句的参数再编译一次,而留下sql拼接的安全漏洞,因此也就避免了sql注入问题.)

3. 代码的可读性和可维护性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值