关 于 2022年01月06日整理发布:介绍MySQL数据库的预处理preparedstatement性能测试的知识大家了解吗?以下就是小编整理的关于2022年01月06日整理发布:介绍MySQL数据库的预处理preparedstatement性能测试的介绍,希望对大家有帮助!
我将告诉你一些关于准备好的MySQL数据库语句的性能测试。相信朋友们也应该很关心这个话题。现在,我给朋友们讲讲准备好的MySQL数据库语句的性能测试。边肖还收集了准备好的MySQL数据库语句性能测试的相关信息。我希望你看到后会喜欢。
免费学习推荐:mysql视频教程
(资料图)
1.预处理做了什么?
当我们提交一个数据库语句时,该语句到达数据库服务。数据库服务需要解析这个sql语句,例如,在执行之前优化语法检查和查询条件。对于预处理,客户机和数据库服务之间的原始交互分为两次。首先,提交数据库语句,让数据库服务首先解析该语句。其次,提交参数调用语句并执行。这样,对于重复执行的语句,提交并解析数据库语句一次,然后重复调用刚刚解析的语句并执行就足够了。这样可以节省多次解析同一个语句的时间。从而达到提高效率的目的。
预处理语句支持占位符,并通过绑定占位符提交参数。非常重要的一点是,只有值可以绑定到占位符,而不是sql语句的一些关键字。示例:“从学生所在的学生中选择*。id=?”。如果你放一个占位符(?)是“1或1=1”,那么“1或1=1”将被视为一个值,也就是说,它将被包含在``符号中,最后这个非法语句将出错。从而达到sql注入(SQL injesion)的漏洞。
预处理机制的三个主要步骤:
1.预处理语句。
2.执行语句
3.销毁预处理语句。
2.表“performance _ schema”介绍。` prepared _ statements _ instances "
运行sql脚本:显示像“% prepare%”这样的全局变量。您可以看到一个名为“performance _ schema _ max _ prepared _ statement _ instances”的系统变量。值0表示预处理语句性能数据记录表“performance _ schema”。` prepared _ statements _ instances "未启用;-1表示记录数量的动态处理;其他正整数值表示performance _ schema _ max _ prepared _ statement _ instance记录的最大数量。
什么是表“performance _ schema”。` prepared _ statements _ instances `?用于记录预处理语句的一些基本信息和性能数据。例如预处理语句的id、预处理语句的名称、预处理语句的具体语句内容、预处理语句执行的次数、每个预处理语句所属的线程ID等。当我们创建预处理语句时,我们将向该表中插入一段数据。预处理语句基于这样一个事实,即当连接断开时,预处理语句会被自动删除。而是“性能模式”。` prepared _ statements _ instances "表是全局的,与数据库连接无关。有了这个数据,我们可以知道1。代码中执行的语句是否经过预处理2。通过了解预处理语句的执行情况,我们可以决定在业务中是否需要对语句进行预处理。
3.qt准备功能的描述
根据我自己的项目需求,这个测试的客户端代码使用了Qt。这里记录了一个关键函数:QSqlQuery类的prepare函数。调用prepare函数就是向数据库提交一个创建预处理语句的命令。这意味着在调用过程中将会有与数据库服务的交互。需要注意的是,当同一个QSqlQuery类对象第二次调用prepare时,第一次调用prepare创建的预处理语句将被删除,然后创建一个预处理语句,即使这两个预处理语句是相同的。调用QQL Query的exec函数时,之前QQL Query创建的预处理语句也会被删除。因此,当连接在查询结束时关闭或者在查询中执行其他语句时,表“performance _ schema”。` prepared _ statements _ instances "将被误认为是创建了没有相关预处理语句记录的预处理语句。事实上,Qt的实践也让我们避免了人为删除预处理语句。
4.实验猜想
正常执行的语句和预处理后执行的语句的区别在于,在多次执行的情况下,预处理后的语句只需要解析一次sql语句,然后在传输参数和绑定参数上花费更多的时间。预处理语句在返回结果时使用二进制传输协议,而普通语句使用文本格式的传输协议。因此,我们做出以下猜想并加以验证。
1.如果执行一个简单的语句,普通执行和预处理执行的性能差别不大。预处理语句仅在重复执行复杂语句时显示优势。
2.查询结果集很大。
据量的情况下预处理语句会展现出性能优势。5、实验数据记录
序号是否预处理语句是否远程数据库返回数据量每次实验语句执行总次数三次实验平均总耗时/单位毫秒1是select * from task where task.taskId in (?)是10001000698222否select * from task where task.taskId in (arr)是10001000667783是select * from task where task.taskId = ?是1100012604否select * from task where task.taskId = id是110009515是select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like "%s%" and b.file_id > 100000 and b.file_id < 200000 and a.taskId = ";是2100021306否select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like "%s%" and b.file_id > 100000 and b.file_id < 200000 and a.taskId = 32327";是2100014807是select * from task where task.taskId in (?)否10001000570518否select * from task where task.taskId in (arr)否10001000562359是select * from task where task.taskId = ?否1100021710否select * from task where task.taskId = id否1100020411是select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like "%s%" and b.file_id > 100000 and b.file_id < 200000 and a.taskId = ";否2100036612否select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like "%s%" and b.file_id > 100000 and b.file_id < 200000 and a.taskId = 32327";否210003806、结论
实验的数据结果和我预期的相差有点儿大但经过反复检查测试代码和测试过程确认测试本身应该没有问题。尊重实验数据我们得出以下结论:
1、通过实验5和实验6对比实验11和实验12对比可得猜想1是错误的。结论应该是:MySQL预处理和常规查询在简单语句和复杂语句下都没有显著性的性能差别。
2、通过实验1和实验2对比实验7和实验8对比可得猜想2是错误的。结论应该是:MySQL预处理和常规查询的结果在数据传输上没有显著性的性能差距。
3、此外对比远程数据库和本地数据库实验数据。可得结论:MySQL数据库在本地会给数据操作带来显著性的性能提高。
相关免费学习推荐:mysql数据库(视频)
以上就是介绍MySQL数据库的预处理(prepared statement)性能测试的详细内容!
来源:php中文网