MySQL数据库中预处理预备语句性能测试的示例

介绍

小编给大家分享一下MySQL数据库中预处理预备语句性能测试的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强> 1,预处理干了什么

当我们提交一条数据库语句时,语句到达数据库服务那边,数据库服务需要解析这条sql语句,比如说语法检查,查询条件先后优化,然后才执行。对于预处理,简单来说就是把客户端与数据库服务原本一次交互的分成两次。首先,提交数据库语句,让数据库服务先解析这条语句。其次,提交参数,调用语句并执行。这样对于多次重复执行的语句来说,可以提交并解析一次数据库语句就可以了,然后不断的调用刚刚解析过得语句并执行。这样就省去了多次解析同一条语句的时间,从而达到提高效率的目的。

预处理语句支持占位符(夹),通过绑定占位符的方式提交参数。一个非常重要的一点是,能与占位符绑定的只能是值,而不能是sql语句的一些关键词。例如语句:“从学生,学生选择*。id=?”。如果放入占位符(?)中的是“1或1=1”,那么“1或1=1”就会被当成一个值,即用“符号包括起来,最终这条非法的语句就出错了。从而达到放sql注入的漏洞(sql injestion)。

预处理机制主要的三步骤:

1,将语句进行预处理

2,执行语句

3,析构掉预处理语句。

<强> 2,关于“performance_schema”。“prepared_statements_instances”表的介绍

运行sql脚本:显示全局变量就像“% %”做准备。可以看到一个叫“<代码> performance_schema_max_prepared_statement_instances 的<代码>的系统变量,其值为0表示不启用预处理语句性能数据记录表> performance_schema_max_prepared_statement_instances>

表“performance_schema”。“prepared_statements_instances”又是什么呢?它是用来记录预处理语句的一些基本信息和性能数据。比如预处理语句的ID、预处理语句的名字,预处理语句的具体语句内容,预处理语句被执行的次数,每次执行耗时,每条预处理语句所属的线程ID等。当我们创建一条预处理语句时,就会插入一条数据到这张表里。预处理语句是基于连接的,连接断开,则预处理语句自动删除。但“performance_schema”。“prepared_statements_instances”表是全局的,它与数据库连接没关系。有了这些数据,我们就可以知道,1代码中执行的语句是否真的做了预处理,2,通过了解预处理语句的执行情况来决定业务中是否需要把一个语句进行预处理。

<强> 3,qt准备函数说明

根据我自己本身的项目需求,这次测试的客户端代码使用的是qt。这里记录一个关键的函数:QSqlQuery类的准备函数。调用准备函数即是向数据库提交一个创建预处理语句的命令。意味着调用期间,是会与数据库服务进行一次交互的。需要注意的是,当同一个QSqlQuery类对象调用第二次准备时,会将第一次调用准备创建的预处理语句删除掉,然后再创建一条预处理语句,即便是这两条预处理语句是一模一样的。在调用QSqlQuery的exec函数时,也会将QSqlQuery先前创建的预处理语句删除掉。所以在查询结束,关闭掉连接,或者查询又执行了其他语句,从而导致“performance_schema”。“prepared_statements_instances”表没有相关预处理语句的记录,就会误认为预处理语句创建失败。其实Qt的这种做法,也省去了要我们人为的删除预处理语句。

<强> 4,实验猜想

常规执行的语句和预处理后执行的语句不同点在于,在多次执行的情况下,预处理语句只需解析一次sql语句,而之后多花时间在传输参数和绑定参数上。预处理语句在返回结果时,使用的是二进制传输协议,而普通语句使用的是文本格式的传输协议,因此我们做出以下猜想并验证。

1,如果执行的是简单语句,那么普通执行和预处理执行性能上差别不大。预处理语句在重复执行复杂的语句情况下才展现出优势。

2,在查询结果集是大数据量的情况下,预处理语句会展现出性能优势。

<强> 5,实验数据记录,

序号是否预处理语句是否远程数据库返回数据量每次实验语句执行总次数三次实验平均总耗时/单位毫秒1是select *从任务的任务。taskId在(?)是10001000698222否select *从任务的任务。taskId (arr)是10001000667783是select *从任务的任务。taskId=?是1100012604否select *从任务的任务。taskId=任务id是110009515是select *左加入task_file b>以上是“MySQL数据库中预处理预备语句性能测试的示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

MySQL数据库中预处理预备语句性能测试的示例